Регулярное выражение Python для извлечения положительных и отрицательных чисел между двумя специальными символами - PullRequest
2 голосов
/ 20 сентября 2019

Необходимо извлечь значение из строки, значение может содержать запятую, десятичную точку, запятую и десятичную точку, без запятой или десятичной запятой, с любой запятой или десятичной дробью.

Дляпример:

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

Ответы [ 4 ]

1 голос
/ 25 сентября 2019

Вы хотите извлечь любое число между > и < символами.

Вы можете использовать

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

См. regex demo .

Подробности

  • > - > char
  • ([-+]?\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']
0 голосов
/ 20 сентября 2019

Просто подставьте запятые и приведите к числу с плавающей точкой:

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 s, используйте 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]
0 голосов
/ 20 сентября 2019

Похоже, вы пытаетесь захватить все допустимые числовые форматы, поэтому это будет работать:

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

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

0 голосов
/ 20 сентября 2019

Ваше регулярное выражение не учитывает, когда число имеет ',' и '.'Вы можете использовать приведенное ниже регулярное выражение для соответствия всем случаям:

re.findall(r'[-+]?\d+(?:,\d+)?(?:\.\d+)?'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...