从文件中读取正则表达式字符 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);
我正在从一个文件中读取正则表达式,在这个文件出现之前通常没有任何问题:
^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);