0

当我运行下面的脚本时,我根本没有得到任何输出。我真正想做的是:从可迭代对象创建一个字符串,然后将此字符串用作re.findall. Print(tab), 给a-z0-9.

import re   

 my_tab = ['a-z',
            '0-9']

    tab = ''.join(my_tab)
    line = 'and- then 3 times minus 456: no m0re!'

    re.findall('tab', 'line')

我在这里想念什么?这是实现这一目标的最pythonic方式吗?

4

3 回答 3

3

这不起作用,您正在告诉正则表达式在 string'tab'中搜索字符串'line'

即使你没有犯那个错误。并且确实使用'a-z 0-9'您命名的字符串和您命名的字符串进行搜索 tab,您将一无所获,这是因为作为正则表达式捕获组无效,并且在这种情况下将导致不匹配。'and- then 3 times minus 456: no m0re!'line'a-z 0-9'

如果您想查找小写字母 (az) 或数字 (0-9) 的任何实例,您可以使用以下命令:

>>> re.findall('([a-z\d])', 'and- then 3 times minus 456: no m0re!')
['a', 'n', 'd', 't', 'h', 'e', 'n', '3', 't', 'i', 'm', 'e', 's', 'm', 'i', 'n', 'u', 's', '4', '5', '6', 'n', 'o', 'm', '0', 'r', 'e']

但我不明白这对你有什么帮助?也许您可以解释一下您要做什么。无论哪种方式,我建议您阅读有关正则表达式的信息以了解更多信息。

于 2013-07-11T13:29:04.570 回答
2

You have done 'tab' and not tab. One is a string, another is a variable. You want to do re.findall(tab, line) (see how tab is no longer a string). You also did this for line.

However, if you print tab beforehand, you'll notice you have:

a-z0-9

When I think you're intending to have

[a-z0-9]

So you can concatenate strings:

>>> print re.findall('['+tab+']',line) # Here we add a bracket to each side
                                       # of a-z0-9 to create a valid regex 
                                       # capture group [a-z0-9]
['a', 'n', 'd', 't', 'h', 'e', 'n', '3', 't', 'i', 'm', 'e', 's', 'm', 'i', 'n', 'u', 's', '4', '5', '6', 'n', 'o', 'm', '0', 'r', 'e']

Or you can use str.format():

>>> print re.findall('[{}]'.format(tab),line)
['a', 'n', 'd', 't', 'h', 'e', 'n', '3', 't', 'i', 'm', 'e', 's', 'm', 'i', 'n', 'u', 's', '4', '5', '6', 'n', 'o', 'm', '0', 'r', 'e']
于 2013-07-11T13:28:46.303 回答
0
re.findall(tab, line)

您使用了两个字符串而不是变量。实际上我认为你想要的是re.findall('[a-z0-9]', line). 但是为了这个目标,你可以只使用 list comprehension [x for x in list(line) if x != ' ']

于 2013-07-11T13:28:29.457 回答