regex - 列表理解中的 Python 3.5.2 正则表达式返回所有条目 - 与其他示例不一致
问题描述
我正在搜索特定条目的列表。条目是数字后跟斜线(一次或多次)。
如果我将示例放入字符串并使用 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_pax_split'], item)
每次运行时都返回一个匹配对象,而re.match('rasp', item)
不是。因此,结果re.match(rx['ls_pax_split'], item)
总是真实的。
尝试添加.group(0)
到第 22 行的末尾以获取与正则表达式匹配的字符串,如果没有匹配,则添加一个空字符串(即错误值)。
像这样:
idx = [i for i, item in enumerate(l) if re.match(rx['ls_pax_split'], item).group(0)]
编辑
虽然以上将解决这个问题,但可能有更好的方法来避免处理.group
. 正则表达式(\d+\/?)*
将匹配(\d+\/?)
零次或多次,这意味着它会生成大量误报,其中它检测到零匹配并因此返回匹配。将其更改为(\d+\/?)+
将通过查找一个或多个来解决此示例(\d+\/?)
。
推荐阅读
- scala - 在“if-else 结构”之外找不到“if-else 结构”中定义的值
- javascript - JS 中有没有像 Python 中的 int.from_bytes() 这样的函数?
- django - 如果值为 null,则自定义 Django Rest Framework 序列化程序字段不运行`to_representation()`
- healpy - 使用 synalm 生成的字段的 Cls 与使用 synfast 生成的字段的输入 Cls 和 Cls 不一致
- python - 如何从文档中获取一个值并为其添加另一个值?
- python - 如何在 wxPython 中加载多个图像?
- oracle - SSMA for Oracle:如何在没有触发器的情况下迁移表
- c# - 为什么我的 web api 总是无法执行 HttpGet 请求?
- tensorflow - tensorflow.keras 无法导入激活
- python - 从python中的文本文件中检索特定html标签之间的文本