Как я могу удалить запятые при использовании regex.findall? - PullRequest
0 голосов
/ 28 октября 2019

Скажите, у меня есть следующая строка: txt = "Balance: 47,124, age, ... Balance: 1,234 ..."

(эллипсы обозначают другой текст).

Я хочу использовать регулярное выражение для поиска списка сальдо, т. Е. re.findall(r'Balance: (.*)', txt)

Но я хочу вернуть только 47124 и 1234 вместо 47,124 и 1234. Очевидно, я мог бы заменить строку впоследствии, но это похоже на итерацию строки дважды, и, таким образом, выполнение этой операции вдвое дольше.

Я хотел бы иметь возможность выводить результаты без запятых , пока делает re.findall.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вот способ выполнения замен при обработке каждого совпадения, который может быть несколько более эффективным, чем сбор всех совпадений и последующее выполнение замен:

txt = "Balance: 47,124, age, ... Balance: 1,234 ..."
balances = [bal.group(1).replace(',', '') for bal in re.finditer(r'Balance: ([\d,]+)', txt)]
print (balances)

Вывод:

['47124', '1234']
0 голосов
/ 28 октября 2019

Попробуйте использовать следующий шаблон регулярных выражений:

Balance: (\d{1,3}(?:,\d{3})*)

Это будет соответствовать только сумме баланса, разделенной запятыми, и не получит ничего другого. Пример сценария:

txt = "Balance: 47,124, age, ... Balance: 1,234, age ... Balance: 123, age"
amounts = re.findall(r'Balance: (\d{1,3}(?:,\d{3})*)', txt)
amounts = [a.replace(',', '') for a in amounts]
print(amounts)

['47124', '1234', '123']

Вот как работает шаблон регулярного выражения:

\d{1,3}      match an initial 1 to 3 digits
(?:,\d{3})*  followed by `(,ddd)` zero or more times

Таким образом, шаблон соответствует от 1 до 999, а затем допускает те же значения, за которыми следуют одна или несколько запятых. группа разлученных тысяч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...