我正在从一个文件中读取正则表达式,并且在这个出现之前通常没有问题:
^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):
这将匹配两个字符串。
任何人都知道如何解决这个问题? 谢谢!
答案 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;
希望它会有所帮助。
感谢。