![](/img/trans.png)
[英]How can I remove all non-letter (all languages) and non-numeric characters from a string?
[英]Remove non-letter characters from beginning and end of a word
我需要從單詞的開頭和結尾刪除所有非字母字符,但如果它們出現在兩個字母之間,請保留它們。
例如:
'123foo456' --> 'foo'
'2foo1c#BAR' --> 'foo1c#BAR'
我嘗試使用re.sub()
,但我無法編寫正則表達式。
像這樣?
re.sub('^[^a-zA-z]*|[^a-zA-Z]*$','',s)
s
是輸入字符串。
您可以使用str.strip :
In [1]: import string
In [4]: '123foo456'.strip(string.digits)
Out[4]: 'foo'
In [5]: '2foo1c#BAR'.strip(string.digits)
Out[5]: 'foo1c#BAR'
正如馬特在評論中指出的那樣(謝謝,馬特),這只會刪除數字。 要刪除任何非字母字符,
用非字母定義你的意思:
In [22]: allchars = string.maketrans('', '')
In [23]: nonletter = allchars.translate(allchars, string.letters)
然后剝離:
In [18]: '2foo1c#BAR'.strip(nonletter)
Out[18]: 'foo1c#BAR'
有了您的兩個例子,我能夠創建一個使用Python的非貪婪語法描述一個正則表達式在這里 。 我將輸入分為三部分:非字母,專用字母,然后非字母直到結束。 這是一個測試運行:
1:[123] 2:[foo] 3:[456]
1:[2] 2:[foo1c#BAR] 3:[]
這是正則表達式:
^([^A-Za-z]*)(.*?)([^A-Za-z]*)$
並且mo.group(2)
你想要什么,其中mo
是MatchObject。
要兼容unicode:
^\PL+|\PL+$
\\PL
代表not a letter
試試這個:
re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);
圓括號捕獲字符串開頭和結尾的非字母字符串之間的所有內容。 的?
確保.
也沒有捕獲任何非字母字符串。 然后替換只是打印捕獲的組。
result = re.sub('(.*?)([a-z].*[a-z])(.*)', '\\\\2', '23WERT#3T67', flags=re.IGNORECASE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.