如何在Python中重新编译变量?

时间:2015-09-05 22:15:37

标签: python regex

我是初学者。这似乎很简单,但我花了几个小时搜索并尝试不同的事情,没有运气。我想将我正在编译的字符串表示为变量。

这样可行:

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'

2 个答案:

答案 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 sheetmanual

['4c'](错误!它代表一个字符'4c,但有重复'

['4c](右!它代表一个字符'4c),

[4c'](右!它代表一个字符'4c),

[4c](右!它代表一个字符4c

其次,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)