如何定义正则表达式,例如:包括字母和 () 但不包括 .和数字使用 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'

我不知道如何使用正则表达式来定义像 'include something and exclude something at the same time' 这样的模式。

尤其是第一个和最后一个字符串:'a bb Aas' 和 'aaaa 1 bb Aas'。我想要第一个,我不想要第二个。但我不知道这些词会有多少个字,有多少个数字。但只要有数字和。在首都之前,我不需要它们。

如果您要包含字母 () 和 space,那么它会自动排除其他元素。

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\(\)]*$ 上进行匹配来过滤掉无效结果,第二个使用正向先行收集所需的子字符串:.*?(?= [A-Z]).

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']