繁体   English   中英

您如何将这些组与 Python 正则表达式匹配?

[英]How do you match these groups with Python regex?

我有一个奇怪的情况,这个简单的代码没有按预期运行:

import re

text = 'This Level: 75.3'
matches = re.search(r'(?:(?:\d{1,3},)(?:\d{3},)*(?:\d{3})|\d*)(?:\.\d+)?', text)

print(matches.match)

我不断返回一个空白字符串......但是,我希望这是75.3 这适用于其他用例,例如:

assert util.strip_str_to_float('7') == 7.0
assert util.strip_str_to_float('75') == 75.0
assert util.strip_str_to_float('75.5') == 75.5
assert util.strip_str_to_float('7.7.9') == 7.7
assert util.strip_str_to_float('1,298.3 Gold') == 1298.3

最终,我试图从给定的字符串中提取并转换第一个浮点数......我没想到这个测试用例会失败。 当匹配不是从字符串的开头开始时,它似乎特别失败。 如果我删除非捕获组,搜索似乎工作正常,例如,这有效:

matches = re.search(r'\d*\.\d+', text)

但这不会:

matches = re.search(r'\d*(?:\.\d+)?', text)

有任何想法吗...?

看起来您允许没有小数部分的纯整数以及没有整数部分的小数(如“.5”)。 这很好,但是由于这两个部分都是可选的,所以当两个部分都不存在时,您也会进行匹配,因此您会得到很多空的 0 长度匹配项。

这也是您的模式r'\d*\.\d+'起作用的原因,因为需要小数点。

pattern = r'\d{1,3}(?:,\d{3})*(?:\.\d+)?|\.\d+'

如果我正确理解了这个问题,那么这种模式应该可以工作。 它分为两部分,因此它查找以下任一部分:

  • 带有可选小数部分的整数,或
  • 必需的小数部分,前面没有整数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM