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

时间:2015-01-06 09:51:52

标签: regex python-2.7

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

^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):

这将匹配两个字符串。

任何人都知道如何解决这个问题? 谢谢!

2 个答案:

答案 0 :(得分:3)

问题在于:

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

VS

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

注意区别?第一个示例为您提供带有实际Unicode字符的Unicode字符串(仅显示显示作为转义序列),第二个示例为您提供带有反斜杠和语法的非Unicode字符串破碎的人物类。

当您从文件中读取表达式时,您将获得第二个变体。您需要将其转换为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);

答案 1 :(得分:-1)

如果你只需要英文字母和数字必须匹配,而不是ascii或其他字符试试这个正则表达式 - &#34; \ b ^ X [\ u0000- \ u007F] + \ b&#34;

它只会匹配&#34; XFlowers为你&#34;

希望它会有所帮助。

感谢。