regex 如何在Python中使用正则表达式过滤带有空格的数值

pzfprimi  于 12个月前  发布在  Python
关注(0)|答案(4)|浏览(130)

我是Python新手,使用的是3.8版本。我使用正则表达式来过滤字符串,特殊字符和数字。字符和数字之间有空格,我试图过滤它们。我可以过滤字符串直到第一个数字。我无法过滤字符串,直到最后一个数字。如果你能帮忙的话,我将不胜感激。提前感谢!

s = 'abc (efg): 2.1 296.2'
s1 = re.search(r'abc(\s+)\(efg\):(\s+)(\d+)',s)
print(s1.group())

o/p
abc (efg):  2

s = 'abc (efg): 2.1 296.2'
s1 = re.search(r'abc(\s+)\(efg\):(\s+)(\d+)(\s+)(\d+)',s)
print(s1.group())

o/p
    print(s1.group())
AttributeError: 'NoneType' object has no attribute 'group'
ttcibm8c

ttcibm8c1#

主要的问题是\d正在寻找一个数字,而不是一个小数。你有几个选择来解决这个问题。
一种选择是,

abc(\s+)\(efg\):(\s+)[\d.]+(\s+)[\d.]+

See in action
注:最后两个数字可能与格式不正确的数字匹配,例如:1.2.3等。这对你来说可能是个问题也可能不是如果没有更多的样本数据,我们无法判断。
如果你想让它变得超级严格,

abc(\s+)\(efg\):(\s+)[\d]+\.[\d]+(\s+)[\d]+\.[\d]+

See in action

ccgok5k5

ccgok5k52#

  • "...我可以过滤字符串到第一个数字。我无法过滤字符串,直到最后一个数字。..."*

\d语法只匹配整数值 0到9

abc\s+\(efg\):\s+(?=\d)(\S+)
  • \s+(?=\d),任何 * 空白 * 后跟数字
  • (\S+),捕获任何连续的 * 非空白 * 字符

这里有一个例子。

s1 = re.search(r'abc\s+\(efg\):\s+(?=\d)(\S+)',s)
print(s1.group(1))

输出

2.1
6ju8rftf

6ju8rftf3#

它可能是你的正则表达式,试试这样:

s1 = re.search(r'abc(\s+)\(efg\):(\s+)(\d+(\.\d+)?) (\d+(\.\d+)?)', s)
yws3nbqq

yws3nbqq4#

你的正则表达式的问题是\d+不会匹配像2.1296.2这样的浮点数。它不包括小数点。
有关正则表达式匹配字符串中此类浮点数的示例,请参见下文。通过使小数点和后面的数字可选,它也将匹配一个整数。

>>> r = re.compile(r'( \d+ (?: \. \d+ )? )', re.X)
>>> m = r.search('296.2')
>>> m.group()
'296.2'
>>> m = r.search('296')
>>> m.group()
'296'

然后可以将其合并到更大的正则表达式中。

>>> num_re = r'\d+(?:\.\d+)?'
>>> r = re.compile(rf'abc(\s+)\(efg\):(\s+)({num_re})(\s+)({num_re})')
>>> m = r.search('abc (efg): 2.1 296.2')
>>> m.groups()
(' ', ' ', '2.1', ' ', '296.2')
>>> m.group()
'abc (efg): 2.1 296.2'

相关问题