【问题标题】:Getting wrong data with regex使用正则表达式获取错误数据
【发布时间】:2026-01-05 08:05:01
【问题描述】:

我在这里遇到了一个问题。 Python 3.7 版。

https://regex101.com/r/WVxEKM/3

正如您在正则表达式网站上看到的,我的正则表达式运行良好,但是,当我尝试使用 python 读取字符串时,我只得到第一部分,即逗号后没有值。

这是我的代码:

part_number = str(row)
partn = re.search(r"([a-zA-Z0-9 ,-]+)", part_number)
print(partn.group(0))

这是partn.group(0) 正在打印的内容:

FMC2H-OHC-100018-00

我需要将字符串作为正则表达式,带有逗号和值:

FMC2H-OHC-100018-00, 2

是我的正则表达式错了吗?逗号和值发生了什么?

行值 这是转换为字符串的行值,从我的数据库中检索的数据还包括括号和引号:

('FMC2H-OHC-100018-00', 2)
('FMC2H-OHC-100027-00', 0)

【问题讨论】:

  • 我读到 group(0) 返回完全匹配,那我做错了什么?
  • 请将您的输入复制到问题中,以便在本地重现您的结果。
  • \(\w{5}-\w{3}-\d{6}-\d{2}, \d+\)?
  • 顺便说一句,您的字符类与单引号不匹配。
  • 编辑问题以包含 part_number 的值。

标签: python regex python-3.x parsing


【解决方案1】:

我认为您不需要将行值转换为字符串,然后尝试使用正则表达式解析结果。线索是当您在更新中说“这是转换为字符串的行值”时暗示它们最初采用其他格式 - 因为结果看起来它们实际上是 tuples 的两个值,一个字符串和一个整数。

如果这是正确的,那么您可以避免将它们转换为字符串,然后尝试使用正则表达式对其进行解析,因为您只需使用 Python 必须执行的相对简单的内置字符串格式化功能即可获得所需的字符串.

这就是我的意思:

# Raw row data retrieved from database.
rows = [('FMC2H-OHC-100018-00', 2),
        ('FMC2H-OHC-100027-00', 0),
        ('FMC2H-OHC-100033-00', 0),
        ('FMC2H-OHC-100032-00', 20),
        ('FMC2H-OHC-100017-00', 16)]

for row in rows:
    result = '{}, {}'.format(*row)  # Convert data in row to a formatted string.
    print(result)

输出:

FMC2H-OHC-100018-00, 2
FMC2H-OHC-100027-00, 0
FMC2H-OHC-100033-00, 0
FMC2H-OHC-100032-00, 20
FMC2H-OHC-100017-00, 16

【讨论】:

    【解决方案2】:

    您的问题是您的角色组中没有包含'。所以这个正则表达式匹配例如FMC2H-OHC-100018-00, 2,但不能同时匹配。 re.search 在找到第一个匹配项后也会停止搜索。因此,如果您只想要第一场比赛,请使用:

    re.search(r"([\w ',-]+)", part_number)
    

    我将A-Za-z0-9 更改为\w,因为它更短且更具可读性。如果您想要一个匹配所有元素的列表,请使用:

    re.findall(r"([\w ',-]+)", part_number)
    

    【讨论】:

    • 就个人而言,我会使用\(\w{5}-\w{3}-\d{6}-\d{2}, \d+\),它更具体。
    • 这也是我会做的,但我想尽可能少地更改 OP 的正则表达式,因为他仍然可能有这样做的原因。不过,很好的补充!另外你还是错过了' ;)
    • 哦,对不起,我只是从我的评论中复制了它,由于某种原因,当我更正它时,它没有在这个标签中更新。我现在在 regex101 中打开的正则表达式是 '(\w{5}-\w{3}-\d{6}-\d{2})', (\d+),SO 的实时更新功能很糟糕。猜猜我抄完后第32次没看……
    • [\w\d] = \w,但\w不等于[A-Za-z0-9],在Python 3中,\w匹配任何Unicode字母、数字、_和一些变音符号。