python3:regex,查找以特定字符串开头和结尾的所有子字符串

python3:regex,查找以特定字符串开头和结尾的所有子字符串,python,regex,python-3.x,Python,Regex,Python 3.x,假设我有一个字符串,如下所示: a = '1253abcd4567efgh8910ijkl' 我想找到所有以数字开头,以字母结尾的子字符串 我试过了 b = re.findall('\d.*\w',a) 但这给了我 ['1253abcd4567efgh8910ijkl'] 我想要一些像 ['1234abcd','4567efgh','8910ijkl'] 我该怎么做?我对regex方法非常陌生,如果有人能在regex中展示如何用不同的方法来实现这一点,并解释发生了什么,我将不胜感激 \w

假设我有一个字符串,如下所示:

a = '1253abcd4567efgh8910ijkl'
我想找到所有以数字开头,以字母结尾的子字符串

我试过了

b = re.findall('\d.*\w',a)
但这给了我

['1253abcd4567efgh8910ijkl']
我想要一些像

['1234abcd','4567efgh','8910ijkl']

我该怎么做?我对regex方法非常陌生,如果有人能在regex中展示如何用不同的方法来实现这一点,并解释发生了什么,我将不胜感激

\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']

现在将它们放在一起,以匹配您想要的内容。

\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']
现在将它们放在一起以匹配您的确切需求。

从中,它告诉我们
\w

匹配任何字母数字字符和下划线;这相当于集合[a-zA-Z0-9_2;]

所以你实际上过度捕捉了你需要的东西。稍微优化一下正则表达式:

>>> 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']
从中,它告诉我们
\w

匹配任何字母数字字符和下划线;这相当于集合[a-zA-Z0-9_2;]

所以你实际上过度捕捉了你需要的东西。稍微优化一下正则表达式:

>>> 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']
  • \w将字符串与任何字母数字字符匹配。您已将\w与*一起使用。因此,您的代码将提供一个以数字开头的字符串,该字符串包含任意长度的字母数字字符

  • 解决方案:

    >>>b=re.findall('\d*[A-Za-z]*', a)
    >>>b
    ['1253abcd', '4567efgh', '8910ijkl', '']
    
  • 您将在列表末尾获得“”(空字符串),以显示不匹配项。您可以使用

    b.pop(-1)
    
      • \w将字符串与任何字母数字字符匹配。您已将\w与*一起使用。因此,您的代码将提供一个以数字开头的字符串,该字符串包含任意长度的字母数字字符

      • 解决方案:

        >>>b=re.findall('\d*[A-Za-z]*', a)
        >>>b
        ['1253abcd', '4567efgh', '8910ijkl', '']
        
      • 您将在列表末尾获得“”(空字符串),以显示不匹配项。您可以使用

        b.pop(-1)
        

      您的预期结果有点短。可能有96个子字符串以数字开头,以字母结尾。您的预期结果有点短。共有96个子字符串,以数字开头,以字母结尾。使用+和*符号有什么区别?看起来如果我使用+,它不会在最后给我一个空字符串。*符号在这里做什么?+将在至少有1个字符时匹配。*即使没有字符也将匹配。所以*更一般。但在您的情况下,如果a=''1253abcd4567efgh8910'比b=re.findall('\d*[a-Za-z]+',a)不会返回最后一个8910字符串。但在上述情况下,它将返回['1253abcd','4567efgh','8910',']。所以,选择哪一个适合你的代码。使用+和*符号有什么区别?看起来如果我使用+,它不会在最后给我一个空字符串。*符号在这里做什么?+将在至少有1个字符时匹配。*即使没有字符也将匹配。所以*更一般。但在您的情况下,如果a=''1253abcd4567efgh8910'比b=re.findall('\d*[a-Za-z]+',a)不会返回最后一个8910字符串。但在上述情况下,它将返回['1253abcd','4567efgh','8910',']。因此,请选择适合您的代码的选项。