从文件中读取正则表达式字符 Class 说明符

Reading Regex Character Class Specifier from File

我正在从一个文件中读取正则表达式,在这个文件出现之前通常没有任何问题:

^X.{0,2}[\u2E80-\u9FFF]  # \u2E80-\u9FFF matches most Chinese and Japanese characters

正则表达式在内部编译时工作正常:

p = re.compile(u'^X.{0,2}[\u2E80-\u9FFF]', re.IGNORECASE | re.UNICODE)
print p.search(u'XFlowers for you')  
>> none
print p.search(u'X桜桜桜桜')
>> <match object>

但是字符范围说明符在导入过程中显然是乱码,因为它几乎匹配任何以 X 开头的内容:

f = codecs.open(filename, "r", "utf-8")
lines = f.read().splitlines()
filePatterns = FileHelper.fileToList(ignoreFile)
patternList = [re.compile(x, re.IGNORECASE | re.UNICODE) for x in ignorePatterns]

for name in [u'XFlowers for you', u'X桜桜桜桜']
    for pattern in patternList:
        print pattern.search(name):

这将匹配两个字符串。

有人知道怎么解决吗? 谢谢!

如果您只需要匹配英文字母和数字,而不是 ascii 或其他字符,请尝试此正则表达式 - "\b^X[\u0000-\u007F]+\b"

它只会匹配 "XFlowers for you"

希望对您有所帮助。

谢谢。

问题出在这里:

>>> u'^X.{0,2}[\u2E80-\u9FFF]'
u'^X.{0,2}[\u2e80-\u9fff]'

>>> '^X.{0,2}[\u2E80-\u9FFF]'
'^X.{0,2}[\u2E80-\u9FFF]'

注意到区别了吗?第一个例子给你一个 Unicode 字符串 actual Unicode characters (只有 displayed 作为转义序列),第二个给你一个非 Unicode带有反斜杠和语法错误字符的字符串 class.

当您从文件中读取表达式时,您会得到第二个变体。您需要将其转换为 Unicode 字符串 - 通过将文件保存为 Unicode 并使用实际的 Unicode 字符,而不是 Python 转义序列,或者保持一切不变并使用 this answer 中的辅助函数,

import re

def unicode_unescape(s):
        """
        Turn \uxxxx escapes into actual unicode characters
        """
        def unescape_one_match(matchObj):
                escape_seq = matchObj.group(0)
                return escape_seq.decode('unicode_escape')
        return re.sub(r"\u[0-9a-fA-F]{4}", unescape_one_match, s)

你可以做到

>>> unicode_unescape('^X.{0,2}[\u2E80-\u9FFF]')
u'^X.{0,2}[\u2e80-\u9fff]'

或者,在上下文中:

f = codecs.open(filename, "r", "utf-8")
lines = f.read().splitlines()
filePatterns = FileHelper.fileToList(ignoreFile)
patternList = [re.compile(unicode_unescape(x), re.IGNORECASE | re.UNICODE) for x in patternList]

for name in [u'XFlowers for you', u'X桜桜桜桜']
    for pattern in patternList:
        print pattern.search(name);