繁体   English   中英

Python 正则表达式提取两个特殊字符之间的正负数

[英]Python regex to extract positive and negative numbers between two special characters

需要从字符串中提取值,该值可以包含逗号,小数点,逗号和小数点都可以,不带逗号或小数点,带逗号或小数点。

例如:

1,921.15
921.15
921
1,921

re.findall(r'[-+]?\d+[,.]?\d*',st)[3]" its extracting only 1,921 but not as 1,921.15


st='["FL gr_20 PT10 MT3\'><strong>1,921.15</strong>"]'

我试过re.findall(r'[-+]?\d+[,.]?\d*',st)[3]它只提取 1,921 但不是 1,921.15

从下面的字符串 st,使用 re 模块,我需要提取值 1,921.15

st='["FL gr_20 PT10 MT3\'><strong>1,921.15</strong>"]'

Expected = 1,921.15
Actual = 1,921

通常,当您想使用 Python 正则表达式从文本中提取正数或负数 integer 或浮点数时,可以使用以下模式

re.findall(r'[-+]?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?', text)

请参阅此正则表达式演示 注意\d{1,3}(?:,\d{3})+替代匹配 integer 数字,逗号作为千位分隔符。 您可以调整它以匹配您需要的千位分隔符,例如,如果千位分隔符是不间断空格,则为\xA0 ,或者\. 如果它是一个点等。

更多选项看起来像

re.findall(r'[-+]?\d+(?:\.\d+)?', text) # Integer part is compulsory, e.g. 5.55
re.findall(r'[-+]?\d*\.?\d+', text)     # Also matches .57 or -.76

在这里,您要提取介于><字符之间的任何数字。

您可以使用

re.findall(r'>([-+]?\d[\d,.]*)<', text)

请参阅正则表达式演示

细节

  • > - 一个>字符
  • ([-+]?\d[\d,.]*) - 第 1 组:
    • [-+]? - 可选-+
    • \d - 一个数字
    • [\d,.]* - 0 个或多个数字,.

请参阅Python 演示

import re
st='''["FL gr_20 T3\'><strong>+1,921.15</strong>"]' st='["FL gr_20 T3\'><strong>-921.15</strong>"]' st='["FL gr_20 T3\'><strong>21.15</strong>"]' st='["FL gr_20 T3\'><strong>1,11,921.15</strong>"]' st='["FL gr_20 T3\'><strong>1,921</strong>"]' st='["FL gr_20 T3\'><strong>112921</strong>"]' st='["FL gr_20 T3\'><strong>1.15</strong>"]' st='["FL gr_20 T3\'><strong>1</strong>"]'''
print(re.findall(r'>([-+]?\d[\d,.]*)<', st))
# => ['+1,921.15', '-921.15', '21.15', '1,11,921.15', '1,921', '112921', '1.15', '1']

当数字有“,”和“。”时,您的正则表达式不会考虑在内。 您可以使用以下正则表达式来匹配所有情况:

re.findall(r'[-+]?\d+(?:,\d+)?(?:\.\d+)?'

只需替换逗号并转换为浮点数:

In [1]: l = ['1,921.15', '921.15', '921', '1,921']
   ...:

In [2]: l
Out[2]: ['1,921.15', '921.15', '921', '1,921']

In [3]: [float(x.replace(',','')) for x in l]
Out[3]: [1921.15, 921.15, 921.0, 1921.0]

如果您真的想摆脱.0 ,请使用is_integer()仅转换整数:

In [4]: [int(f) if f.is_integer() else f for f in [float(x.replace(',','')) for x in l]]
Out[4]: [1921.15, 921.15, 921, 1921]

看起来您试图捕获所有任何有效的数字格式,所以这会起作用:

[+-]?\d+(?:,\d{3})*(\.\d+)*

https://regex101.com/r/5bygVO/1

暂无
暂无

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

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