Py学习  »  Python

如何定义类似regex的:包括字母和(),但不包括。和使用python的数字

Feng Chen • 5 年前 • 1340 次点击  

我刚开始使用python进行regex。现在我有个问题,比如:

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'

我不知道使用regex来定义类似“同时包含和排除某些内容”的模式。

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

有人能帮我吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38955
 
1340 次点击  
文章 [ 2 ]  |  最新文章 5 年前
furas
Reply   •   1 楼
furas    5 年前

如果您将包括字母()和空格,那么它将自动排除其他元素。

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)
ggorlen
Reply   •   2 楼
ggorlen    5 年前

您可以使用两个regex操作。第一个通过匹配 ^[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']

如果预期某些字符串可能会通过筛选(即,包含除字母字符、括号或空格之外的其他内容),但可能与lookahead不匹配,则需要筛选中间结果:

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