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