Регулярное выражение Python не соответствует тому, что другие инструменты регулярного выражения соответствуют - PullRequest
1 голос
/ 28 мая 2019

У меня есть следующий код:

currencies = ['USD', 'GBP', 'EUR', 'JPY', 'CHF', 'SEK', 'DKK', 'NOK', 'SGD', 'HKD', 'AUD', 'TWD', 'NZD', 'CNY', 'KRW', 'INR', 'CAD', 'VEF', 'EGP', 'THB', 'IDR', 'PKR', 'MYR', 'PHP', 'MXN', 'VND', 'CZK', 'HUF', 'PLN', 'TRY', 'ZAR', 'ILS', 'ARS', 'CLP', 'BRL', 'RUB', 'QAR', 'AED', 'COP', 'PEN', 'CNH', 'KWD', 'SAR']
exclusive_regexp = ".*\/" + ".*|.*\/".join(currencies) + ".*"
searching_regexp = "^(?! (" + exclusive_regexp + ")$)(.*\/.*)$"
searching_regexp = re.compile(searching_regexp) 


with open('raw.txt', 'r') as unprocessed_ticks:
    print(re.findall(searching_regexp, unprocessed_ticks.read()))

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

Я исследовал сгенерированное регулярное выражение с помощью онлайн-инструмента regex101.com. это работает со вкусом питона. Но в реальном коде это ничего не соответствует: https://regex101.com/r/70uiuE/7 Почему это может произойти?

1 Ответ

1 голос
/ 28 мая 2019

Пара моментов:

  • Нет необходимости экранировать / в Python (и любых других) string pattern (/ следует экранировать только тогда, когдарегулярное выражение задается с помощью литерала регулярного выражения с косыми чертами, используемыми в качестве разделителей регулярных выражений)
  • Вы чрезмерно используете шаблон .*, вам следует минимизировать количество альтернатив, совпадающих в одном месте в строке
  • Чтобы ^ и $ соответствовали началу и концу строки, вы должны передать регулярное выражение флаг re.M или re.MULTILINE.

Я предлагаю изменить регулярные выражения на

exclusive_regexp = r"/(?:{})".format("|".join(currencies))
searching_regexp = re.compile(r"^(?! .*" + exclusive_regexp + ")[^/\n]*/.*", re.M) 

, а затем

print(searching_regexp.findall(unprocessed_ticks.read()))

Регулярное выражение exclusive_regexp будет выглядеть более аккуратно (/(?:USD|GBP|EUR|JPY|CHF|SEK|DKK|NOK|SGD|HKD|AUD|TWD|NZD|CNY|KRW|INR|CAD|VEF|EGP|THB|IDR|PKR|MYR|PHP|MXN|VND|CZK|HUF|PLN|TRY|ZAR|ILS|ARS|CLP|BRL|RUB|QAR|AED|COP|PEN|CNH|KWD|SAR)), а searching_regexp будет соответствовать любой строке, которая начинается с 0+ символов, отличных от /, затем имеет /, а затем любое количество любых символов, кроме новой строки ([^/\n]*/.*), которая начинается не с пробела, / и значения валюты.

См. Демо Python .

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