我是初学者。这似乎很简单,但我花了几个小时搜索并尝试不同的事情,没有运气。我想将我正在编译的字符串表示为变量。
p = re.compile("['4c']")
for m in p.finditer('234567891JQKA'):
q = str(m.start() + 2)
card = ['4c']
p = re.compile(card)
for m in p.finditer('234567891JQKA'):
q = str(m.start() + 2)
在我的程序卡中不断变化。我该怎么做?
File "C:\Python34\lib\re.py", line 223, in compile
return _compile(pattern, flags)
File "C:\Python34\lib\re.py", line 282, in _compile
p, loc = _cache[type(pattern), pattern, flags]
TypeError: unhashable type: 'list'
答案 0 :(得分:2)
第二个示例中的问题是您将['4c']
(列表)分配给card
而不是"['4c']"
(字符串适用于你的第一个例子)。 re.compile
需要字符串模式。
按如下方式进行调整,您的第二个示例将像第一个示例一样工作:
import re # added for clarity
card = "['4c']"
# ^ ^
p = re.compile(card)
# or
card = ['4c']
p = re.compile(str(card)) # str(card) == "['4c']"
# ^^^^ ^
for m in p.finditer('234567891JQKA'):
q = str(m.start() + 2)
# added for clarity
print m.start() # prints 2
print q # prints 4
说完这个 后,模式"['4c']"
似乎很可疑。 regex character set(由开头'
和结束[
限定)至少]
是多余的:确保card
是指定一个字符串的字符串合理的正则表达式模式满足您的需求。
答案 1 :(得分:1)
您的计划中至少有两个错误
首先,一个奇怪的正则表达式通配符
你想在使用它之前至少阅读一个基本的正则表达式,你明确地误解了它,这里有一些有用的cheat sheet和manual。
['4c']
(错误!它代表一个字符'
,4
或c
,但有重复'
)
['4c]
(右!它代表一个字符'
,4
或c
),
[4c']
(右!它代表一个字符'
,4
或c
),
[4c]
(右!它代表一个字符4
或c
)
其次,Python列表!=正则表达式通配符
['4c']
是一个包含字符串'4c'
,
"['4c']"
是一个包含正则表达式通配符的字符串。
最后,如果您更喜欢使用代码的第二种形式,那么您的代码应该看起来像这样
card = "['4c']" # not clear here what you want to do
p = re.compile(card)
for m in p.finditer('234567891JQKA'):
q = str(m.start() + 2)