使用正则表达式迭代并匹配所有元素

时间:2017-09-26 15:31:27

标签: python regex match

所以我有这样的事情:

data = ['Alice Smith and Bob', 'Tim with Sam Dunken', 'Uncle Neo & 31']

我想用名字替换每个元素,所以它看起来像这样:

data = ['Alice Smith', 'Tim', 'Uncle Neo']

到目前为止,我得到了:

for i in range(len(data)):
    if re.match('(.*) and|with|\&', data[i]):
        a = re.match('(.*) and|with|\&', data[i])
        data[i] = a.group(1)

但它似乎不起作用,我认为这是因为我的模式,但我无法找到正确的方法来做到这一点。

5 个答案:

答案 0 :(得分:2)

将列表理解与re.split一起使用:

result = [re.split(r' (?:and|with|&) ', x)[0] for x in data]

答案 1 :(得分:0)

简化您对以下方法的处理:

import re

data = ['Alice Smith and Bob', 'Tim with Sam Dunken', 'Uncle Neo & 31']
data = [re.search(r'.*(?= (and|with|&))', i).group() for i in data]

print(data)

输出:

['Alice Smith', 'Tim', 'Uncle Neo']
  • .*(?= (and|with|&)) - 积极的前瞻断言,确保姓名/姓氏.*后面跟着来自交替小组的任何项目(and|with|&)

答案 2 :(得分:0)

|需要在您的尝试中使用括号分组。无论如何,它太复杂了。

我只想使用re.sub删除分隔词&其余的:

data = [re.sub(" (and|with|&) .*","",d) for d in data]

结果:

['Alice Smith', 'Tim', 'Uncle Neo']

答案 3 :(得分:0)

你可以试试这个:

import re
data = ['Alice Smith and Bob', 'Tim with Sam Dunken', 'Uncle Neo & 31']
final_data = [re.sub('\sand.*?$|\s&.*?$|\swith.*?$', '', i) for i in data]

输出:

['Alice Smith', 'Tim', 'Uncle Neo']

答案 4 :(得分:0)

如果可能的话,我会建议使用Casimir的答案,但是,如果您不确定可能跟随哪个词(也就是说andwith和{{1}是动态的),那么你可以使用这个正则表达式。

注意:此正则表达式不适用于某些特殊情况,例如带有撇号&或破折号'的名称,但您可以将它们添加到您要搜索的字符列表中。这个答案还取决于以大写字母开头的名称和"联合词"因为我将其命名为-andwith等,而不是以大写字母开头。

代码

See this regex in use here

<强>正则表达式

&

<强>换人

^((?:[A-Z][a-z]*\s*)+)\s.*

结果

输入

$1

输出

Alice Smith and Bob
Tim with Sam Dunken
Uncle Neo & 31

说明

  • 在字符串Alice Smith Tim Uncle Neo
  • 的开头处断言位置
  • 匹配大写字母字符^
  • 匹配任意数量的小写字母[A-Z]
  • 在任意数量的空白字符之间匹配(如果您更喜欢使用[a-z]*,则可以指定空格)*
  • 在一次和无限次之间匹配上述条件,全部捕获到捕获组1 \s*:其中......包含上述所有内容
  • 匹配空白字符,后跟任意字符(新行除外)任意次数
  • (...)+:替换为捕获组1