Python3 регулярное выражение - PullRequest
1 голос
/ 30 января 2020

Вот моя проблема. Ниже приведен список:

a = ['COP' , '\t\t\t', 'Basis', 'Notl', 'dv01', '6m', '9m', '1y',
     '18m', '2y', '3y', "15.6", 'mm', '4.6', '4y', '5y', '10', 'mm',
     '4.6', '6y', '7y', '8y', '9y', '10y', '20y', 'TOTAL', '\t\t9.2' ]

Я пытаюсь получить некоторые результаты, как этот. Самым важным примечанием являются строки. После первого числа, оканчивающегося на «y» или «m», придет число, только если оно есть в списке. Пример: ('3y', '15 .6 ',' ')

ВЫБОР ВЫБОРА (забудь о структуре, которая является кортежем, просто хочу получить значения)

('6m', '', '')
('9m', '', '')
('1y', '', '')
('18m', '', '')
('2y', '', '')
('3y', '15.6', '')
('4y', '', '')
('5y', '10', '')
('6y', '', '')
('7y', '', '')
('8y', '', '')
('9y', '', '')
('10y', '', '')
('20y', '', '')

Я использовал следующее регулярное выражение, которое должно было вернуть:

  1. все числа следуют "y" или "m" => (\ b \ d + [ym] \ b)
  2. , а затем любым числом (целое или нет), если оно появляется (означает ноль или более раз) => (\ b [0-9] +. [0-9] \ b)

Вот что я сделал, используя Python3 regex и re.findall (), но все еще не получил результат

rule2 = re.compile(r"(\b\d+[ym]\b)(\b[0-9]+.*[0-9]*\b)+")
a_str = " ".join(a)
OUT2 = re.findall(rule2, a_str)
print(OUT2)
# OUT2 >>[]

Почему я не получаю правильный результат?

1 Ответ

3 голосов
/ 30 января 2020

Вы не можете использовать границу слова дважды. Поскольку данные разделены не буквами / цифрами, вместо них используйте \W+.

Затем выберите точку и сделайте ее необязательной, иначе вы не найдете совпадения 10. Не используйте .*, так как он будет соответствовать слишком много (жадность регулярных выражений)

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

rule2 = re.compile(r"\b(\d+[ym])\W+([0-9]+\.?[0-9]*)\b")
a_str = " ".join(a)
OUT2 = re.findall(rule2, a_str)
print(OUT2)

[('3y', '15.6'), ('5y', '10')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...