簡體   English   中英

如何定義正則表達式,如:包含字母和 () 但不包含 。 和數字使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM