Python 基于条件替换列表中项目的更有效方法

Python 基于条件替换列表中项目的更有效方法,python,regex,Python,Regex,我有下面的代码。基本上,我试图替换一个单词,如果它与这些正则表达式模式中的一个匹配。如果单词匹配一次,则该单词应完全从新列表中删除。下面的代码可以工作,但是,我想知道是否有一种方法可以实现这一点,这样我就可以无限期地向“pat”列表添加更多模式,而不必在for循环中编写额外的if语句 为了澄清,我的正则表达式模式有消极的lookahead和lookbehind,以确保它是一个单词 pat = [r'(?<![a-z][ ])Pacific(?![ ])', r'(?<![a-z][

我有下面的代码。基本上,我试图替换一个单词,如果它与这些正则表达式模式中的一个匹配。如果单词匹配一次,则该单词应完全从新列表中删除。下面的代码可以工作,但是,我想知道是否有一种方法可以实现这一点,这样我就可以无限期地向“pat”列表添加更多模式,而不必在for循环中编写额外的if语句

为了澄清,我的正则表达式模式有消极的lookahead和lookbehind,以确保它是一个单词

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