在 python 列表中使用正则表达式(re.search)

Posted

技术标签:

【中文标题】在 python 列表中使用正则表达式(re.search)【英文标题】:Using regex (re.search) in a python list 【发布时间】:2015-08-02 12:43:10 【问题描述】:

我有以下代码

import re

pattern = ['A-minor Type I AGC', 'A-minor Type I AGC', 'A-minor Type I AGC', 'A-minor Type I AUA', 'A-minor Type I AUA', 'A-minor Type II AGC', 'A-minor Type II AGC']

n = len(pattern)
print pattern
pattern_str = ', '.join(pattern)
print pattern_str
for x in range(0, n):
    if re.search(r'\bType I\b', pattern_str):
        print "Hello Type I"
    elif re.search(r'\bType II\b', pattern_str):
        print "Hello Type II"
    else:
        print "An error has occured"

期望的输出应该是:

Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type II
Hello Type II

但我没有得到想要的输出。我目前的输出是:

Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type I

有人能指出问题吗?我怀疑这与列表到 str 的转换有关。我已经设法使用以下代码解决了这个问题:

for x in pattern:
    if re.search(r'\bType I\b', x):
        print "Hello Type I"
    elif re.search(r'\bType II\b', x):
        print "Hello Type II"
    else:
        print "An error has occured"   

但我想知道为什么我的第一个代码不起作用以及如何使它起作用。任何帮助表示赞赏

【问题讨论】:

好吧 - 您只在列表中初始化了一次 pattern_str,这就是您得到结果的原因。你可以做 - 你做了什么(更正确)或以下更改for x in range(0,n): pattern_str = pattern[x] @gabhijit 非常感谢您的回答。您更改 pattern_str = pattern[x] 的建议使第一个代码起作用。再次感谢:) 【参考方案1】:

您将整个列表加入到一个字符串中,然后对其进行大量测试。相反,您想要测试列表中的每个字符串,例如

for pattern_str in pattern:
    if re.search(r'\bType I\b', pattern_str):
        print "Hello Type I"
    elif re.search(r'\bType II\b', pattern_str):
        print "Hello Type II"
    else:
        print "An error has occured"

所以你正在搜索每个模式,一次一个

【讨论】:

【参考方案2】:

你想要什么:搜索列表中的每个字符串。

您的代码的作用

re.search(r'\bType I\b', pattern_str)

它在循环的每次迭代中搜索 pattern_str。什么是pattern_str:

pattern_str = ', '.join(pattern)

因此,在每次迭代中,它都会搜索相同的字符串,这是整个列表的串联,始终匹配 A-minor Type I AGC 中的类型 I。

pattern 中搜索每个x 就可以了

【讨论】:

【参考方案3】:

每次迭代的模式都是相同的。你需要在你的 for 循环中循环你的模式。

使用for p in pattern

这意味着p 在第一次迭代中是'A-minor Type I AGC',在第二次迭代中是'A-minor Type I AGC',等等。

import re

pattern = ['A-minor Type I AGC', 'A-minor Type I AGC', 'A-minor Type I AGC', 'A-minor Type I AUA', 'A-minor Type I AUA', 'A-minor Type II AGC', 'A-minor Type II AGC']

for p in pattern:
    if re.search(r'\bType I\b', p):
        print "Hello Type I"
    elif re.search(r'\bType II\b', p):
        print "Hello Type II"
    else:
        print "An error has occured"

输出:

Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type I
Hello Type II
Hello Type II

【讨论】:

以上是关于在 python 列表中使用正则表达式(re.search)的主要内容,如果未能解决你的问题,请参考以下文章

在 python 列表中使用正则表达式(re.search)

在 Python 中使用正则表达式查找和替换文件中的单词列表

python中有没有办法将存储在列表中的正则表达式模式列表应用于单个字符串?

在字符串列表中查找特定模式(正则表达式)(Python)

使用正则表达式从python中的列表项中删除子字符串

Python SQLite 正则表达式 ExecuteMany