Python 正则表达式与其他正则表达式工具所匹配的不匹配

标签 python regex

我有以下代码:

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 为什么会发生这种情况?

最佳答案

几点:

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

关于Python 正则表达式与其他正则表达式工具所匹配的不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346881/

相关文章:

python - 合并和采样两个 Pandas 时间序列

c# - 正则表达式只允许 0-9 和 - 字符,以及点 (.)

python - 如果其中的任何列表至少包含前一行的一个值,则过滤一个 numpy 数组

python - MacPorts 手动端口位置

python - 无法在 mac 中为 python 安装 opencv .. 下面是错误。否则建议安装 opencv 的更好方法

python - 获取 imagenet 模型 pnasnet_large 与 hub.KerasLayer 一起使用

java - 除非转义,否则在字符串中查找简单模式

java - JSON 的 Java 正则表达式无效

ruby-on-rails - 如何从正则表达式返回 bool 值

c# - 如何用正则表达式替换包含圆括号(圆括号)的文本?