Regex 列表理解中的Python 3.5.2正则表达式返回所有条目-与其他示例不一致
我正在列表中搜索特定条目。输入为数字,后跟斜线(一次或多次) 如果我将一个示例放入一个字符串并使用re.match()得到结果 如果我将字符串放入一个列表并循环,我将从re.match()得到一个结果 如果我尝试使用列表理解获取索引,我将返回所有列表索引 使用不同的列表,我得到了正确的结果 为什么我的正则表达式的列表理解不像控制列表那样返回[2] 示例代码:Regex 列表理解中的Python 3.5.2正则表达式返回所有条目-与其他示例不一致,regex,python-3.x,list-comprehension,Regex,Python 3.x,List Comprehension,我正在列表中搜索特定条目。输入为数字,后跟斜线(一次或多次) 如果我将一个示例放入一个字符串并使用re.match()得到结果 如果我将字符串放入一个列表并循环,我将从re.match()得到一个结果 如果我尝试使用列表理解获取索引,我将返回所有列表索引 使用不同的列表,我得到了正确的结果 为什么我的正则表达式的列表理解不像控制列表那样返回[2] 示例代码: import re import sys from datetime import datetime rxco = re.compile
import re
import sys
from datetime import datetime
rxco = re.compile
rx = {}
#String
s = r'140/154/011/002'
#String in a list
l = ['abc', 'XX123 SHDJ FFFF', s, 'unknown', 'TTL/4/5/6', 'ORD/123']
#Regex to get what I am interested in
rx['ls_pax_split'] = rxco(r'\s?((\d+\/?)*)')
#For loop returns matches and misses
for i in l:
m = re.match(rx['ls_pax_split'], i)
print(m)
#List Comprehension returns ALL entries - NOT EXPECTED
idx = [i for i, item in enumerate(l) if re.match(rx['ls_pax_split'], item)]
print(idx)
#Control Comprehension returns - AS EXPECTED
fruit_list = ['raspberry', 'apple', 'strawberry']
berry_idx = [i for i, item in enumerate(fruit_list) if re.match('rasp', item)]
print(berry_idx)
re.match(rx['ls\u pax\u split',item)
每次运行时都返回一个匹配对象,而re.match('rasp',item)
则不返回。因此,re.match(rx['ls\u pax\u split',],item)
的结果总是真实的
尝试将.group(0)
添加到第22行的末尾,以获取与正则表达式匹配的字符串,如果不匹配,则获取空字符串(即假值)
像这样:
idx=[i代表i,如果重新匹配,枚举(l)中的项目(rx['ls\u pax\u split'],项目)。组(0)]
编辑
虽然上述方法可以解决此问题,但可能有更好的方法可以避免处理.group
的麻烦。正则表达式(\d+\/?)*
将匹配(\d+\/?)
零次或更多次,这意味着它会生成大量误报,其中检测到的匹配正好为零,因此返回匹配。将其更改为(\d+\/?)++
可以通过查找一个或多个(\d+\/?)
re.match(rx['ls\u pax\u split',item)
在每次运行时返回匹配对象,而re.match('rasp',item)
则不返回。因此,re.match(rx['ls\u pax\u split',],item)
的结果总是真实的
尝试将.group(0)
添加到第22行的末尾,以获取与正则表达式匹配的字符串,如果不匹配,则获取空字符串(即假值)
像这样:
idx=[i代表i,如果重新匹配,枚举(l)中的项目(rx['ls\u pax\u split'],项目)。组(0)]
编辑
虽然上述方法可以解决此问题,但可能有更好的方法可以避免处理
.group
的麻烦。正则表达式(\d+\/?)*
将匹配(\d+\/?)
零次或更多次,这意味着它会生成大量误报,其中检测到的匹配正好为零,因此返回匹配。将此更改为(\d+\/?)+
将通过查找一个或多个(\d+\/?)来解决此示例中的问题,谢谢。我知道它必须是这样的,但我不明白为什么我的示例返回一个对象而控件不返回。当然,我将完全相同的东西传递给相同的东西,即正则表达式和要重新匹配的字符串()。你能告诉我区别吗?我以为是字符串正则表达式和编译正则表达式之间的区别,但事实并非如此。相反,它看起来像是正则表达式中的(\d+\/?)*
。匹配(\d+\/?)
零次或多次的。在你不想要匹配的情况下,它匹配了零次。我想您可能需要(\d+\/?)+
一次或多次。我会更新我的答案谢谢。我知道它必须是这样的,但我不明白为什么我的示例返回一个对象而控件不返回。当然,我将完全相同的东西传递给相同的东西,即正则表达式和要重新匹配的字符串()。你能告诉我区别吗?我以为是字符串正则表达式和编译正则表达式之间的区别,但事实并非如此。相反,它看起来像是正则表达式中的(\d+\/?)*
。匹配(\d+\/?)
零次或多次的。在你不想要匹配的情况下,它匹配了零次。我想您可能需要(\d+\/?)+
一次或多次。我会更新我的答案