我使用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,但是这样的东西不是我想要的。而且我不确定如何将这些正则表达式组合起来以获得所需的输出。
答案 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
匹配s
或go
\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)