Python正则表达式:在字符串

时间:2016-02-07 05:20:17

标签: python regex string

我使用python和regex(两者都是新的)来查找字符串中的字符序列,如下所示: 抓取p的第一个实例,后跟任意数字(它总是以p _ _的形式,其中_和_将是整数)。然后找到一个''或者去'去'然后所有整数直到字符串的结尾。例如:

ascjksdcvy的 P12 nbvnzxcm的 nbmbh的 12 HJG的 23

应该产生p12去12 23。

ascjksdcvy p12 nbvnzxcm s nbmbh 12 hjg 23

应该产生p12 s 12 23。

我只是设法获得字符串的p12部分,这是我迄今为止尝试提取的第7部分内容。或者':

decoded = (re.findall(r'([p][0-9]*)',myStr))
print(decoded) //prints p12 

我知道做类似

的事情

re.findall(r'[s]|[go]',myStr)

会给我所有出现的s和g和o,但是这样的东西不是我想要的。而且我不确定如何将这些正则表达式组合起来以获得所需的输出。

2 个答案:

答案 0 :(得分:2)

re.findall与模式分组一起使用:

>>> string = 'ascjksdcvyp12nbvnzxcmgonbmbh12hjg23'
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string)
[('p12', 'go', '12', '23')]

>>> string = 'ascjksdcvyp12nbvnzxcmsnbmbh12hjg23'
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string)
[('p12', 's', '12', '23')]
  • 使用re.findall,我们只愿意获得与模式分组匹配的内容()

  • p\d{2}匹配p

  • 之后的任意两位数字
  • 之后.*匹配任何内容

  • 然后,s|go匹配sgo

  • \D*匹配任意数量的非数字

  • \d+表示一个或多个数字

  • (?:)是一个非捕获组,即内部匹配不会出现在输出中,只是为了分组令牌

注意:

>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+?', string)
[('p12', 's', '12')]

>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+', string)
[('p12', 's', '23')]

我想使用以上两种中的一种,因为匹配后面的数字是一种重复的任务,但是非贪婪和贪婪的匹配都存在问题,因此我们需要匹配s之后的数字或go嗯,有点明确。

答案 1 :(得分:0)

首先,尝试将您的线与最小模式匹配作为测试。使用(grouping)(?:nongrouping) parens来捕获有趣的部分,而不是捕获不感兴趣的部分。存放你关心的东西, 然后砍掉字符串的其余部分并作为第二步搜索数字。

import re
simple_test = r'^.*p(\d{2}).*?(?:s|go).*?(\d+)'
m = re.match(simple_test, line)
if m is not None:
    p_num = m.group(1)
    trailing_numbers = [m.group(2)]

    remainder = line[m.end()+1:]
    trailing_numbers.extend(               # extend list by appending
        map(                               # list from applying
            lambda m: m.group(1),          # get group(1) from match
            re.finditer(r"(\d+)", remainder) # of each number in string
        )
    )

    print("P:", p_num, "Numbers:", trailing_numbers)