regex Python正则表达式:查找逗号后可能为零的整数

ymdaylpp  于 2022-11-18  发布在  Python
关注(0)|答案(4)|浏览(121)

我有以下案例:

Test (2.00001) Test (2.000) Test 2.1 Test (2,0001) Test 2,000 Test 2,1000 test 2

我尝试使用regex只查找整数:

  1. 2.000
  2. 2,000
  3. 2
    而不是其它浮点数。
    我尝试了不同的方法:
re.search('(?<![0-9.])2(?![.,]?[1-9])(?=[.,]*[0]*)(?![1-9]),...)

但对于以下情况,返回true:

  1. 2.00001
  2. 2.000
  3. 2,000
  4. 2,0001
  5. 2
    我该怎么办?

更新

我已经更新了这个问题,它也应该找到一个没有任何逗号和点的整数(2)。

vyswwuz2

vyswwuz21#

我会用途:

import re

text = 'Test (2.00001) Test (2.000) Test 2.1 Test (2,0001) Test 2,000 Test 2,1000'

re.findall(r'(\d+[.,]0+)(?!\d)', text)

输出量:

['2.000', '2,000']

正则表达式:

(        # start capturing
\d+      # match digit(s)
[.,]     # match . or ,
0+       # match one or more zeros
)        # stop capturing
(?!\d)   # ensure the last zero is not followed by a digit

regex demo
如果您还想单独匹配“integers”(用空格或圆括号/方括号括起来):

import re

text = 'Test (2.00001) Test (2.000) Test 2.1 Test (2,0001) Test 2,000 Test 2,1000 2'

re.findall(r'(?:^|[(\s[])(\d+(?:[.,]0+(?!\d))?)(?=[]\s)]|$)', text)

正则表达式:

(?:^|[(\s[])      # match the start of string or [ or ( or space
(                 # start capturing
\d+               # match digit(s)
(?:[.,]0+(?!\d))? # optionally match . or , with only zeros
)                 # stop capturing
(?=[]\s)]|$)      # match the end of string or ] or ) or space

regex demo

p4rjhz4m

p4rjhz4m2#

您可以使用

re.findall(r'\b(?<!\d[.,])\d+(?:[.,]0+)?\b(?![,.]\d)', text)

请参阅regex demo。* 详细数据 *:

  • \b-字边界
  • (?<!\d[.,])-没有数字紧跟在.,的左边
  • \d+-一个或多个数字
  • (?:[.,]0+)?-.,的可选序列,然后是一个或多个零
  • \b-字边界
  • (?![,.]\d)-不允许出现,.,并且允许在紧靠右侧的位置出现一个数字。

如果需要支持千位分隔符:

pattern = r'\b(?<!\d[.,])(?:\d{1,3}(?:(?=([.,]))(?:\1\d{3})+)?|\d{4,})(?:(?!\1)[.,]0+)?\b(?![,.]\d)'
matches = [x.group() for x in re.finditer(pattern, text)]

请参阅this regex demo

5sxhfpxr

5sxhfpxr3#

如果不需要正则表达式,您也可以在尝试将值转换为相应的数值格式后考虑使用is_integer()。虽然它有点难读,但它不需要正则表达式,并且对于给定的字符串结构的进一步用例应该是健壮的:

[x for x in string.split() if float((pd.to_numeric(x.replace(r'(','').replace(r')','').replace(r',','.'),errors='coerce'))).is_integer()]

返回列表中以前的值:

['(2.000)', '2,000', '2']

或者,如果您需要清洁:

[x for x in string.replace(r'(','').replace(r')','').replace(r',','.').split() if float((pd.to_numeric(x,errors='coerce'))).is_integer()]

返回:

['2.000', '2.000', '2']
yks3o0rb

yks3o0rb4#

这应该很容易-只需得到一个数字,然后检查“这是一个int值吗?"。Meaby类似这样的东西...

import re

text = 'Test (2.00001) Test (2.000) Test 2.1 Test (2,0001) Test 2,000 Test 2,1000 test 2'
out_ints = []
for x in  re.findall(r'([0-9.,]+)', text):
    possible_int = x.replace(',', '.')
    is_int = int(float(possible_int)) == float(possible_int)
    if is_int:
        out_ints.append(int(float(possible_int)))

print(out_ints)

输出量:

[2, 2, 2]

还是我错过了什么?

相关问题