我有以下代码:
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在线工具探查了生成的regex。它与python风格一起工作。但是在实际代码中,它什么都不匹配: https://regex101.com/r/70uiuE/7 为什么会发生?
答案 0 :(得分:1)
几点:
/
(/
仅在通过带有以下内容的正则表达式文字设置正则表达式时才应转义)斜杠用作正则表达式分隔符).*
模式,应尽量减少在字符串中相同位置匹配的替代项的数量^
和$
匹配行的开始和结束,必须将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+字符开头的字符串,除了/
之外,然后有一个{ {1}},然后是除换行符(/
)以外的任何字符,这些字符不以空格,[^/\n]*/.*
和货币值开头。
请参见Python demo。