所以我有这样的事情:
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)
但它似乎不起作用,我认为这是因为我的模式,但我无法找到正确的方法来做到这一点。
答案 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的答案,但是,如果您不确定可能跟随哪个词(也就是说and
,with
和{{1}是动态的),那么你可以使用这个正则表达式。
注意:此正则表达式不适用于某些特殊情况,例如带有撇号&
或破折号'
的名称,但您可以将它们添加到您要搜索的字符列表中。这个答案还取决于以大写字母开头的名称和"联合词"因为我将其命名为-
,and
,with
等,而不是以大写字母开头。
<强>正则表达式强>
&
<强>换人强>
^((?:[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]*
,则可以指定空格)*
\s*
:其中......包含上述所有内容(...)+
:替换为捕获组1