Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 列表理解中的Python 3.5.2正则表达式返回所有条目-与其他示例不一致_Regex_Python 3.x_List Comprehension - Fatal编程技术网

Regex 列表理解中的Python 3.5.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

我正在列表中搜索特定条目。输入为数字,后跟斜线(一次或多次)

如果我将一个示例放入一个字符串并使用re.match()得到结果

如果我将字符串放入一个列表并循环,我将从re.match()得到一个结果

如果我尝试使用列表理解获取索引,我将返回所有列表索引

使用不同的列表,我得到了正确的结果

为什么我的正则表达式的列表理解不像控制列表那样返回[2]

示例代码:

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+\/?)+
一次或多次。我会更新我的答案