让我们说我有一个看起来像这样的字符串:
a = '1253abcd4567efgh8910ijkl'
我想找到所有以数字开头的子字符串,并以字母结尾。
我试过了,
b = re.findall('\d.*\w',a)
但是这给了我,
['1253abcd4567efgh8910ijkl']
我希望有类似的东西,
['1234abcd','4567efgh','8910ijkl']
我该怎么做?我对正则表达式方法很陌生,如果有人能够在正则表达式中以不同的方法展示如何做到这一点,我会非常感激,并解释发生了什么。
答案 0 :(得分:3)
\w
将匹配任何字符,其中包含数字,字母和下划线符号。您需要使用[a-zA-Z]
来捕获字母。见这个例子。
import re
a = '1253abcd4567efgh8910ijkl'
b = re.findall('(\d+[A-Za-z]+)',a)
输出:
['1253abcd', '4567efgh', '8910ijkl']
\d
将匹配数字。 \d+
将匹配一个或多个连续数字。对于例如
>>> re.findall('(\d+)',a)
['1253', '4567', '8910']
同样地,[a-zA-Z]+
将匹配一个或多个字母。
>>> re.findall('([a-zA-Z]+)',a)
['abcd', 'efgh', 'ijkl']
现在把它们放在一起以匹配你想要的东西。
答案 1 :(得分:2)
从Python manual on regular expressions开始,它告诉我们\w
:
匹配任何字母数字字符和下划线;这相当于集[a-zA-Z0-9 _]
所以你实际上是在捕捉你需要的东西。稍微改进你的正则表达式:
>>> re.findall(r'(\d+[a-z]+)', a, re.I)
['1253abcd', '4567efgh', '8910ijkl']
re.I
使您的表达式不区分大小写,因此它也会匹配大写和小写字母:
>>> re.findall(r'(\d+[a-z]+)', '12124adbad13434AGDFDF434348888AAA')
['12124adbad']
>>> re.findall(r'(\d+[a-z]+)', '12124adbad13434AGDFDF434348888AAA', re.I)
['12124adbad', '13434AGDFDF', '434348888AAA']
答案 2 :(得分:1)
\ w将字符串与任何字母数字字符匹配。并且你使用\ w和*。因此,您的代码将提供一个以数字开头并包含任意长度的字母数字字符的字符串。
解决方案:
>>>b=re.findall('\d*[A-Za-z]*', a)
>>>b
['1253abcd', '4567efgh', '8910ijkl', '']
你会得到''列表末尾的(空字符串)显示不匹配。您可以使用
删除它b.pop(-1)