2017-02-15 75 views
0

我有一大堆我正在尝试清除的单词。这些词中的许多词出现多次,每次都有点不同,我想对它们进行归一化。比如我想换成下面的话:如果存在匹配的单词,则替换整个字符串

list = ["resident super", "super live in", "on site superintendent in building", "livein super", "residential super", "superintendent lives in", "on-site super"...] 

只有superintendent

我想我可以用

for item in list: 
    re.sub("resident super|super live in|on site superintendent in building| livein super|residential super|superintendent lives in|on-site super", 
      "superintendent", list) 

做到这一点,但我肯定会错过一些条目。所有的条目都包含单词super,但有没有一种方法可以制定正则表达式规则,用所需的单词替换整个项目?

+0

的问题是,你要替换一个词的空格分隔的单词列表。所以你必须详尽无遗,否则正则表达式不会知道何时开始/停止替换单词。例如:“我是超人居住的人”:我在哪里开始/停止替换? –

+0

如果您的“单词”是逐行提供的,则可以通过简单匹配\ bsuper \ b来替换整个字符串。 –

+0

我正在考虑使用'for'循环遍历列表中的每个成员。如果该成员包含“super”这个词,那么整个成员应该由'superintendent'替代。 – Lukasz

回答

1

re.sub方法不会替换字符串。它不能,因为Python中的字符串是不可变的。当您对字符串进行替换时,它将返回一个包含请求更改的新字符串(如果没有匹配,则返回原始字符串)。您目前忽略了返回值,因此您的代码无效。

但我不认为你真的需要正则表达式来解决这个问题。如果您想更换以字符串"superintendent"提到这个词super任何地方的任何字符串,你可以使用一个简单的子测试:

for i, item in enumerate(list_of_strings): 
    if "super" in item: 
     list_of_strings[i] = "superintendent" 

这当然会更容易出现假阳性比使用当前的正则表达式。如果你想要的话,你仍然可以使用上述代码的结构和正则表达式搜索(只需在将pattern设置为与你想要的字符串匹配的正则表达式后将if "super" in item:行更改为if re.search(pattern, item):)。

1

我不确定我是否理解你的问题,但是如果你想用superintendant替换super这个词的每个元素,我会这样做。

for index,element in enumerate(listToCheck): 
    if "super" in element: 
     listToCheck[index]="superintendant" 

顺便说不要命名变量list,因为它是一个保留的Python关键词。

1

我可能会误解你的问题,但是你不能用in代替吗?这似乎并不需要正则表达式,因为正则表达式要慢得多。

例如:

i=0 
while i < len(list): 
    if 'super' in list[i]: 
     list[i] = 'superintendant' 
    i+=1 

这将替换在列表中的一切,包括supersuperintendent

1

最短与列表理解:

lst = ["resident super", "super live in", "on site superintendent in building", 
"livein super", "residential super", "superintendent lives in", "on-site super", "mega-intendent"] 

new_lst = ['superintendent' if 'super' in item else item 
      for item in lst] 

print(new_lst) 
# ['superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 'superintendent', 
# 'superintendent', 'mega-intendent'] 
相关问题