Python正则表达式的帮助

时间:2014-05-14 19:59:33

标签: python regex

我有一个看起来像这样的字符串

24 (prem)-42-48 (6 ext)

以及我想要摆脱的是

['24 prem', '42', '48', '6 ext']

我可以得到这样的数字:

import re
MyString = r'24 (prem)-42-48 (6 ext)'
Splits = re.findall( r'(\d+)', MyString) # ['24','42','48','6']

但我丢失了后续文字。

我也可以这样做:

import re
MyString = r'24 (prem)-42-48 (6 ext)'
Splits = re.findall( r'[\\s:\\-]', MyString) # ['24 (prem)','42', '48 (6 ext)']

但错过了(6 ext)项。

看到回复后编辑:

我想也许对我来说最简单的方法就是拆分数字,然后用str.replace去掉“(”和“”字符。

那么,是否有一个简单的正则表达式语句在数字的第一个字符之前拆分字符串?

上执行的结果

'24 (prem)-42-48 (6 ext)'

将是

['24 (prem)-','42-',48 (', '6 ext)]

2 个答案:

答案 0 :(得分:2)

要获得该结果,您不需要regexp,您需要做的就是通过用空格替换它们来删除不需要的字符并将字符串拆分为空格:

>>> s ="24 (prem)-42-48 (6 ext)"
>>> l = s.replace('(',' ').replace('-',' ').replace('(',' ').replace(')',' ').split()
>>> l
['24', 'prem', '42', '48', '6', 'ext']

这是一个使用translate for python3的版本:

>>> s.translate(s.maketrans("()-", "   ")).split()
['24', 'prem', '42', '48', '6', 'ext']

这是使用正则表达式的版本:

>>> list(filter(lambda x: x is not '', re.findall('[^-() ]*', s)))
['24', 'prem', '42', '48', '6', 'ext']
但是,我认为结果列表中的'24 prem''6 ext'是您输入的拼写错误,否则没有通用的方式来做您想做的事情,尽管你可以做到这一点:

>>> [" ".join(l[:2])] + l[2:-2] + [" ".join(l[-2:])]
['24 prem', '42', '48', '6 ext']

答案 1 :(得分:0)

我不得不对你的字符串的格式做一些猜测,但这里有匹配的正则表达式。请注意,您将“(”字符与“(”匹配,并使用(...)进行分组。

 regex = re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)')

您可以在一行或一个更大的文本块中找到多个匹配项:

>>> regex=r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)'
>>> re.findall(regex,lines)
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')]
>>> regex= re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)')
>>> line='24 (prem)-42-48 (6 ext)'
>>> regex.match(line).groups()
('24', 'prem', '42', '48', '6', 'ext')
>>> lines="""24 (prem)-42-48 (6 ext)
... 25 (prex)-43-48 (7 ext)
... """
>>> regex.findall(lines)
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')]
>>>