![](/img/trans.png)
[英]How to split messy string to letters and numbers using Regex in Python
[英]How to define a regex like: include letters and () but not include . and numbers using Python
我是使用 Python 的正則表達式的新手。 現在我有一個類似的問題:
myTry=['a bb Aas','aa 1 Aasdf','aa bb (cc) AA','aaa ASD','aa . ASD','aaaa 1 bb Aas']
我要查找的是大寫字母之前的子字符串(本例中為 A),它可能包含多個單詞和 () 但不包含數字和 .. 因此,在本例中,應檢測 myTry 中的以下字符串:
'a bb Aas'
'aa bb (cc) AA'
'aaa ASD'
結果應該是:
'a bb'
'aa bb (cc)'
'aaa'
我不知道使用正則表達式來定義“同時包含某些內容並排除某些內容”之類的模式。
尤其是第一個和最后一個字符串:“a bb Aas”和“aaaa 1 bb Aas”。 我想要第一個,不想要第二個。 但我不知道這些詞中有多少個單詞,有多少個數字。 但只要有數字和。 在大寫字母之前,我不需要它們。
如果您將包含字母、() 和空格,則它會自動排除其他元素。
import re
myTry = ['aa bb Aas','aa 1 Aasdf','aa bb (cc) AA','aa ASD','aa . ASD']
for item in myTry:
if re.match('[a-z() ]*A', item):
print(item)
您可以使用兩個正則表達式操作。 第一個通過匹配^[a-zA-Z\\s\\(\\)]*$
過濾掉無效結果,第二個使用正向前瞻收集所需的子字符串: .*?(?= [AZ])
。
import re
my_try = ['a bb Aas','aa 1 Aasdf','aa bb (cc) AA','aaa ASD','aa . ASD','aaaa 1 bb Aas']
filtered = [x for x in my_try if re.match(r'^[a-zA-Z\s\(\)]*$', x)]
result = [re.match(r'.*?(?= [A-Z])', x).group(0) for x in filtered]
print(result) # => ['a bb', 'aa bb (cc)', 'aaa']
如果您預計某些字符串可能會通過過濾器(即包含字母字符、括號或空格以外的內容),但可能與前瞻不匹配,則需要過濾中間結果:
import re
my_try = ['a bb Aas','aaa ASD','aa . ASD','aaaa 1 bb Aas', '']
# ^^ could cause problems
filtered = [x for x in my_try if re.match(r'^[a-zA-Z\s\(\)]*$', x)]
matches = [re.match(r'.*?(?= [A-Z])', x) for x in filtered]
result = [x.group(0) for x in matches if x]
print(result) # => ['a bb', 'aaa']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.