如何在Python列表中使用正则表达式
我需要你的帮助,因为我想在列表中使用正则表达式来获取关键字后面的字符串如何在Python列表中使用正则表达式,python,regex,list,split,Python,Regex,List,Split,我需要你的帮助,因为我想在列表中使用正则表达式来获取关键字后面的字符串 我的列表看起来像: ['Paris, 458 boulevard Saint-Germain', 'Marseille, 29 rue Camille Desmoulins', 'Marseille, 1 chemin des Aubagnens'] 正则表达式: re.compile(ur'(?<=rue|boulevard|quai|chemin).*', re.MULTILINE) 感谢您的帮助。似乎您的正
我的列表
看起来像:
['Paris, 458 boulevard Saint-Germain', 'Marseille, 29 rue Camille Desmoulins', 'Marseille, 1 chemin des Aubagnens']
正则表达式:
re.compile(ur'(?<=rue|boulevard|quai|chemin).*', re.MULTILINE)
感谢您的帮助。似乎您的正则表达式在Python中不起作用,它抛出的错误是
look behind需要固定宽度的模式
另外,请注意,正则表达式中的re.MULTILINE
标志是多余的,因为没有^
或$
来重新定义模式中的行为
以下是您可以使用的代码:
import re
lst = ['Paris, 458 boulevard Saint-Germain', 'Marseille, 29 rue Camille Desmoulins', 'Marseille, 1 chemin des Aubagnens']
p = re.compile(r'.*(?:rue|boulevard|quai|chemin)')
print [p.sub('', x).strip() for x in lst]
结果:
['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens']
r.*(?:rue | boulevard | quai | chemin)
regex匹配
*
-0或更多任意字符
(?:rue | boulevard | quai | chemin)
-1个用|
分隔的备选方案
然后使用re.sub
删除匹配的文本
注意:您可以强制整词与\b
词边界匹配,以便chemin
匹配,而不是chemin
:
r'.*\b(?:rue|boulevard|quai|chemin)\b'
在python正则表达式中,lookbehind需要具有恒定的宽度。
试试这个更简单的正则表达式-
>>> regex = re.compile(ur'(?:rue|boulevard|quai|chemin)(.*)', re.MULTILINE)
>>> [re.findall(regex, e)[0].strip() for e in my_list]
['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens']
编辑:
使用不同的lookbehind可以起作用-
(?:(?<=rue)|(?<=boulevard)|(?<=quai)|(?<=chemin))(.*)
(?:(?>>[re.findall(regex,e)[0].strip()表示li中的e]
['Saint-Germain'、'Camille Desmoulins'、'des Aubagnens']
(?:(?<=rue)|(?<=boulevard)|(?<=quai)|(?<=chemin))(.*)
>>> regex = re.compile(ur'(?:(?<=rue)|(?<=boulevard)|(?<=quai)|(?<=chemin))(.*)', re.MULTILINE)
>>> [re.findall(regex, e)[0].strip() for e in li]
['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens']