Python 基于条件替换列表中项目的更有效方法
我有下面的代码。基本上,我试图替换一个单词,如果它与这些正则表达式模式中的一个匹配。如果单词匹配一次,则该单词应完全从新列表中删除。下面的代码可以工作,但是,我想知道是否有一种方法可以实现这一点,这样我就可以无限期地向“pat”列表添加更多模式,而不必在for循环中编写额外的if语句 为了澄清,我的正则表达式模式有消极的lookahead和lookbehind,以确保它是一个单词Python 基于条件替换列表中项目的更有效方法,python,regex,Python,Regex,我有下面的代码。基本上,我试图替换一个单词,如果它与这些正则表达式模式中的一个匹配。如果单词匹配一次,则该单词应完全从新列表中删除。下面的代码可以工作,但是,我想知道是否有一种方法可以实现这一点,这样我就可以无限期地向“pat”列表添加更多模式,而不必在for循环中编写额外的if语句 为了澄清,我的正则表达式模式有消极的lookahead和lookbehind,以确保它是一个单词 pat = [r'(?<![a-z][ ])Pacific(?![ ])', r'(?<![a-z][
pat = [r'(?<![a-z][ ])Pacific(?![ ])', r'(?<![a-z][ ])Global(?![ ])']
if isinstance(x, list):
new = []
for i in x:
if re.search(pat[0], i):
i = re.sub(pat[0], '', i)
if re.search(pat[1], i):
i = re.sub(pat[1], '', i)
if len(i) > 0:
new.append(i)
x = new
else:
x = x.strip()
pat=[r'(?只需为
循环添加另一个:
for patn in pat:
if re.search(patn, i):
i = re.sub(patn, '', i)
if i:
new.append(i)
只需为
循环添加另一个:
for patn in pat:
if re.search(patn, i):
i = re.sub(patn, '', i)
if i:
new.append(i)
pat=[r'(?pat=[r'(?添加另一个循环:
pat = [r'(?<![a-z][ ])Pacific(?![ ])', r'(?<![a-z][ ])Global(?![ ])']
if isinstance(x, list):
new = []
for i in x:
# iterate through pat list
for regx in pat:
if re.search(regx, i):
i = re.sub(regx, '', i)
...
pat=[r'(?添加另一个循环:
pat = [r'(?<![a-z][ ])Pacific(?![ ])', r'(?<![a-z][ ])Global(?![ ])']
if isinstance(x, list):
new = []
for i in x:
# iterate through pat list
for regx in pat:
if re.search(regx, i):
i = re.sub(regx, '', i)
...
pat=[r'(?如果在您的模式中,那么更改只是单词,那么您可以添加与|
连接的单词,使其成为or。因此,对于示例中的两个模式,将变成如下所示的一个
r'(?<![a-z][ ])(?:Pacific|Global)(?![ ])'
r'(?如果在您的模式中,那么更改只是单词,那么您可以添加与|
连接的单词,使其成为or。因此,对于您的两个模式,示例中的两个模式将变成一个,如下所示
r'(?<![a-z][ ])(?:Pacific|Global)(?![ ])'
r'(?类似这样的内容:
[word for word in l if not any(re.search(p, word) for p in pat)]
大概是这样的:
[word for word in l if not any(re.search(p, word) for p in pat)]
我将在这里尝试猜测;如果我错了,请跳到“这就是我将如何编写它”并根据您的意图(我可能不理解)修改我提供的代码
我假设您正在试图删除可能包含“全球”和“太平洋”的短语列表中的单词。
如果是这样的话,我认为您的正则表达式没有实现您指定的功能。您可能打算实现以下内容(它不能按原样工作!):
在模式的正则表达式中,请注意(a)\b
,表示“空字符串,但仅位于单词的开头或结尾”(请参见),(b)使用|
分隔可选模式,以及(c)\s
,表示“考虑空白的字符”.后者负责在每个删除的单词后正确删除不必要的空格
这在Python2和Python3中都能正常工作。我认为代码更加清晰,而且就效率而言,最好让re
去做它的工作,而不是单独测试每个模式
鉴于:
x = ["from Global a to Pacific b",
"Global Pacific",
"Pacific Global",
"none",
"only Global and that's it"]
这将产生:
x = ['from a to b', 'none', "only and that's it"]
我将在这里尝试猜测;如果我错了,请跳到“这就是我将如何编写它”并根据您的意图(我可能不理解)修改我提供的代码
我假设您正在试图删除可能包含“全球”和“太平洋”的短语列表中的单词。
如果是这样的话,我认为您的正则表达式没有实现您指定的功能。您可能打算实现以下内容(它不能按原样工作!):
在模式的正则表达式中,请注意(a)\b
,表示“空字符串,但仅位于单词的开头或结尾”(请参见),(b)使用|
分隔可选模式,以及(c)\s
,表示“考虑空白的字符”.后者负责在每个删除的单词后正确删除不必要的空格
这在Python2和Python3中都能正常工作。我认为代码更加清晰,而且就效率而言,最好让re
去做它的工作,而不是单独测试每个模式
鉴于:
x = ["from Global a to Pacific b",
"Global Pacific",
"Pacific Global",
"none",
"only Global and that's it"]
这将产生:
x = ['from a to b', 'none', "only and that's it"]
首先,你应该做<代码> Re.Sub <代码>,跳过<代码> Re.Stase步骤。如果<代码>子/代码>不能找到匹配,它将不属于任何东西。你可能需要考虑编译你的模式。NOOB问题:为什么你编译你的模式或不重要?我认为你的消极的查找表和LoopBeNeDS是错误的,正如我解释的那样。n在我的回答中。(?表示字符串不能跟在字母空格组合后面,例如“and Pacific”我不想“和太平洋”匹配。我只希望它是“太平洋”的匹配。对于一个,你应该做<代码> Re.Sub <代码>,跳过<代码> Re.Stase步骤。如果<代码>子/代码>找不到匹配,它将不属于任何东西。你可能需要考虑编译你的模式。NoOB问题:为什么你要解决这个问题?我想你的否定lookaheads和lookbehinds是错误的,正如我在回答中所解释的。(?表示字符串不能跟在字母空格组合后面,例如“and Pacific”不会匹配。嗯……我不希望“和Pacific”匹配。我只希望它在“Pacific”时匹配。命名循环变量re
的结果会很糟糕。命名循环变量re
的结果会很糟糕。嗯。我不断得到:TypeError:“NoneType”对象不是iterablewell,有两件事正在迭代:l和pat。其中一个是None
,除非,不知何故,re.search正在进行一些迭代,但是idk.Hm。我一直得到:TypeError:“NoneType”对象不是iterablewell,有两个对象正在被迭代:l和pat。其中一个是None
,除非,不知何故,re.search正在进行一些迭代,但idk.Hm,这是一个s使用现有代码非常容易的解决方案。thanksHm,这是一个使用现有代码非常容易的解决方案。thanksThis非常有用。谢谢!我对你的答案投了赞成票。一件事:你能把这个列表分开吗?x=[s代表s in(re.sub(pat),s代表s in x)如果s!=']我不明白for循环是如何工作的这是一个嵌套的理解:re.sub(pat,,,s)for s in x
生成所有替换的列表,并且[s for s in(如果s!='')
过滤掉空的。如果您愿意,您可以通过调用filter
来编写它:filter(lambda