【问题标题】:Python regex doesn't match what other regex tools do matchPython 正则表达式与其他正则表达式工具不匹配
【发布时间】:2019-05-28 16:52:36
【问题描述】:

我有以下代码:

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 在线工具探测了生成的正则表达式。它适用于 python 风格。但在实际代码中,它不匹配任何东西: https://regex101.com/r/70uiuE/7 为什么会发生?

【问题讨论】:

  • 我怀疑re.findall(searching_regexp, unprocessed_ticks.read(), re.M)
  • 在 python 中不是 \ 一个转义字符,所以你需要双重转义它吗?
  • 您希望这匹配什么文本?斜线不需要在 Python 中进行反斜杠转义。
  • .* 你如此随意地洒可能会导致它的匹配方式比你想要的更多
  • 我认为exclusive_regexp = "/(?:{})".format("|".join(currencies))searching_regexp = "^(?! .*" + exclusive_regexp + ")[^/]*/.*$" 也可以。只需传递re.M 标志。

标签: python regex


【解决方案1】:

几点:

  • 在 Python(和任何其他)string 模式中无需转义 /(仅当通过正则表达式设置正则表达式并将斜杠用作正则表达式时,才应转义 /分隔符)
  • 您过度使用.* 模式,您应该尽量减少在字符串中相同位置匹配的替代项的数量
  • 要使^$ 匹配行的开头和结尾,您必须将re.Mre.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 demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多