在 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 中使用正则表达式查找和替换文件中的单词列表