【发布时间】:2013-08-08 21:57:44
【问题描述】:
如何在正则表达式中使用列表变量? 问题出在这里:
re.search(re.compile(''.format('|'.join(map(re.escape, kand))), corpus.raw(fileid)))
错误是
TypeError: unsupported operand type(s) for &: 'str' and 'int'
简单的 re.search 效果很好,但我需要列表作为 re.search 中的第一个属性:
for fileid in corpus.fileids():
if re.search(r'[Чч]естны[й|м|ого].труд(а|ом)', corpus.raw(fileid)):
dict_features[fileid]['samoprezentacia'] = 1
else:
dict_features[fileid]['samoprezentacia'] = 0
if re.search(re.compile('\b(?:%s)\b'.format('|'.join(map(re.escape, kand))), corpus.raw(fileid))):
dict_features[fileid]['up'] = 1
else:
dict_features[fileid]['up'] = 0
返回 dict_features
顺便说一句,kand 是列表:
kand = [line.strip() for line in open('kand.txt', encoding="utf8")]
在输出 kand 是['apple', 'banana', 'peach', 'plum', 'pineapple', 'kiwi']
编辑:我在 Windows 7 上使用 Python 3.3.2 和 WinPython 完整的错误堆栈:
Traceback (most recent call last):
File "F:/Python/NLTK packages/agit_classify.py", line 59, in <module>
print (regexp_features(agit_corpus))
File "F:/Python/NLTK packages/agit_classify.py", line 53, in regexp_features
if re.search(re.compile(r'\b(?:{0})\b'.format('|'.join(map(re.escape, kandidats_all))), corpus.raw(fileid))):
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\re.py", line 214, in compile
return _compile(pattern, flags)
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\re.py", line 281, in _compile
p = sre_compile.compile(pattern, flags)
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\sre_compile.py", line 494, in compile
p = sre_parse.parse(p, flags)
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\sre_parse.py", line 748, in parse
p = _parse_sub(source, pattern, 0)
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\sre_parse.py", line 360, in _parse_sub
itemsappend(_parse(source, state))
File "F:\WinPython-32bit-3.3.2.0\python-3.3.2\lib\sre_parse.py", line 453, in _parse
if state.flags & SRE_FLAG_VERBOSE:
TypeError: unsupported operand type(s) for &: 'str' and 'int'
【问题讨论】:
-
您希望
''.format做什么? -
你为什么会做
re.search(re.compile(…))?只需将正则表达式模式字符串传递给re.search就可以完成完全相同的事情。或者,如果您需要显式编译正则表达式(例如,性能,因为您将重复使用它们,或者只是重构您的代码),只需在编译后使用search方法正则表达式。 -
我假设格式列表为 apple|banana|peach - 我从 stackoverflow 上的另一个答案中复制了这个
-
另外,我看不出你是怎么从那行代码中得到这个错误的。你能给我们完整的回溯,以及它所指的实际代码行吗?
-
现在实验并意识到这是可行的,但不确定它是否正确或pythonic:re.search(re.compile('\b(?:%s)\b' + '|'.join (map(re.escape, kandidats_all))), corpus.raw(fileid))