如何在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']