我有一个very_largeString
,其中包含单词列表和一些id。我想提取所有具有RG
和AQ
的单词(使用它们的ID),这些单词在形态上连续出现并打印其余的id。输出只是单词及其关联的id,例如:[('word','id'),('word','id')]
very_largeString= ''' Hola hola I 1
compis compis NCMS000 0.500006
! ! Fat 1
No no RN 0.998045
sabía saber VMII3S0 0.592869
como como CS 0.999289
se se P00CN000 0.465639
ponía poner VMII3S0 0.65
una uno DI0FS0 0.951575
lavadora lavadora NCFS000 0.414738
hasta hasta SPS00 0.957698
que que PR0CN000 0.562517
conocí conocer VMIS1S0 1
esta este DD0FS0 0.986779
y y CC 0.999962
muy muy RG 1
sencilla malo AQ0MP0
es ser VSIP3S0 1
que que CS 0.437483
es ser VSIP3S0 1
muy muy RG 1
sencilla sencillo AQ0FS0 1
de de SPS00 0.999984
utilizar utilizar VMN0000 1
! ! Fat 1
'''
这将是所需的输出,因为它们在ID的开头有RG和AQ字符,然后我想返回完整的id,例如:
[('muy', RG), ('sencillo', 'AQ0FS0'),('muy'),('malo','AQ0MP0')]
问题在于我获得了空输出。这就是我的尝试:
result = re.findall("(\S+)\s+(RG\S+).*\n.*\s(\S+)\s+(AQ\S+)",very_largeString)
有人可以帮我解决这个正则表达式吗?我不知道为什么这是错误的。
答案 0 :(得分:1)
您的主要问题是RG\S+
与RG 1
不匹配,因为该空格与一个或多个非空格字符不匹配。我想你想要\s+
吗? (或者可能是\S*
?但我没有看到任何RG1
- 类型可能的匹配。或者根本没有,因为我不确定在这里尝试做什么子模式?)
(\S+)\s+(RG\s+).\n.*\s(\S+)\s+(AQ\S+)
但是,这并没有为您提供所需的输出。它给你的是:
[('muy', 'RG ', 'malo', 'AQ0MP0'), ('muy', 'RG ', 'sencillo', 'AQ0FS0')]
'RG '
很明显 - 你试图在RG
后强制匹配某些,而RG
之后唯一的事情就是空间,你还有什么可能得到的??
你似乎也希望分别匹配第一行和第二行 - 这是可行的,但只有一个非常复杂的表达式与前瞻和后观,并且更简单,只需后处理列表。
您似乎也希望这些对以相反的顺序排列。我认为这在理论上可能是可能的,但我完全不知道你是如何开始这样做的,我怀疑任何有效的方法都会花费指数时间,通过后处理更简单。
最后,出于某种原因,您希望第二对只匹配('muy')
而不是('muy', 'RG')
,而(a)没有任何意义,因为('muy')
不是一个1项元组,它只是字符串'muy'
,而(b)我不知道你是如何期望第一次匹配两个东西但只有一个具有完全相同的模式和相同的行第二次。
假设你的大多数要求实际上并不真实,你唯一要做的就是将它们从4s重组为2s,如下所示:
[('muy', 'RG'), ('malo', 'AQ0MP0'), ('muy', 'RG'), ('sencillo', 'AQ0FS0')]
...我会将\s+
移出正则表达式,并将结果从4组转换为2组,如下所示:
result = re.findall(r"(\S+)\s+(RG)\s+.*\n.*\s(\S+)\s+(AQ\S+)",very_largeString)
flattened = (x for y in result for x in y)
paired = list(zip(flattened, flattened))
答案 1 :(得分:0)
如果你调整它,就像这样
(\S+)\s+(RG\S*).*\n.*[^\S\n](\S+)[^\S\n]+(AQ\S*)
会得到你期望的输出。
( \S+ ) # (1)
\s+
( RG \S* ) # (2)
.* \n
.* [^\S\n]
( \S+ ) # (3)
[^\S\n]+
( AQ \S* ) # (4)
输出:
** Grp 0 - ( pos 358 , len 29 )
muy RG 1
sencilla malo AQ0MP0
** Grp 1 - ( pos 358 , len 3 )
muy
** Grp 2 - ( pos 362 , len 2 )
RG
** Grp 3 - ( pos 376 , len 4 )
malo
** Grp 4 - ( pos 381 , len 6 )
AQ0MP0
------------------------
** Grp 0 - ( pos 446 , len 33 )
muy RG 1
sencilla sencillo AQ0FS0
** Grp 1 - ( pos 446 , len 3 )
muy
** Grp 2 - ( pos 450 , len 2 )
RG
** Grp 3 - ( pos 464 , len 8 )
sencillo
** Grp 4 - ( pos 473 , len 6 )
AQ0FS0
答案 2 :(得分:0)
我试过这个
re.findall('(\w+\s+)(RG\w*|AQ\w*)',very_largeString)
输出:
[('muy ', 'RG'), ('malo ', 'AQ0MP0'), ('muy ', 'RG'), ('sencillo ', 'AQ0FS0')]
如果您想删除重复项,可以使用set