我有一个非常大的字符串s
,s
字符串由word_1
后跟word_2
和id
组成:
word_1 word_2 id number
我想创建一个regex,在一个列表中捕获所有出现的单词,这些单词的idRN_ _ _
后跟idVA_ _ _ _
和idVM_ _ _ _
。提取RN_ _ _ _ _
、VA_ _ _ _ _ _
和VM _ _ _ _
模式的结构是,出现必须一个接一个,其中_
是id
字符串的自由字符此自由字符可以超过3个,例如:
casa casa NCFS000 0.979058
mejor mejor AQ0CS0 0.873665
que que PR0CN000 0.562517
mejor mejor AQ0CS0 0.873665
no no RN
esta estar VASI1S0
lavando lavar VMP00SM
. . Fp 1
这是我想提取的模式,因为它们是一个接一个地放置的。这将是列表中所需的输出:
[('no RN', 'estar VASI1S0', 'lavar VMP00SM')]
例如,这将是错误的,因为它们不是一个接一个的:
error error RN
error error VASI1S0
pues pues CS 0.998047
error error VMP00SM
因此对于s
字符串:
s = '''
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
error error RN
actuar accion VMP00SM
lavadora lavadora NCFS000 0.414738
hasta hasta SPS00 0.957698
error error VMP00SM
que que PR0CN000 0.562517
conocí conocer VMIS1S0 1
esta este DD0FS0 0.986779
error error VA00SM
y y CC 0.999962
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
Todo todo DI0MS0 0.560961
un uno DI0MS0 0.987295
gustazo gustazo NCMS000 1
error error VA00SM
cuando cuando CS 0.985595
estamos estar VAIP1P0 1
error error VMP00RM
aprendiendo aprender VMG0000 1
para para SPS00 0.999103
emancipar emancipar VMN0000 1
nos nos PP1CP000 1
, , Fc 1
que que CS 0.437483
si si CS 0.99954
error error RN
nos nos PP1CP000 0.935743
ponen poner VMIP3P0 1
facilidad facilidad NCFS000 1
con con SPS00 1
las el DA0FP0 0.970954
error error VMP00RM
tareas tarea NCFP000 1
de de SPS00 0.999984
no no RN 0.998134
estás estar VAIP2S0 1
condicionado condicionar VMP00SM 0.491858
alla alla VASI1S0
la el DA0FS0 0.972269
casa casa NCFS000 0.979058
error error RN
error error VASI1S0
pues pues CS 0.998047
error error VMP00SM
mejor mejor AQ0CS0 0.873665
que que PR0CN000 0.562517
mejor mejor AQ0CS0 0.873665
no no RN 1
esta estar VASI1S0 0.908900
lavando lavar VMP00SM 0.9080972
. . Fp 1
'''
这就是我尝试的:
import re
weird_triple = re.findall(r'(?s)(\w+\s+RN)(?:(?!\s(?:RN|VA|VM)).)*?(\w+\s+VA\w+)(?:(?!\s(?:RN|VA|VM)).)*?(\w+\s+VM\w+)', s)
print "\n This is the weird triple\n"
print weird_triple
此方法的问题是返回模式RN_ _ _ _
、VA_ _ _ _
、VM_ _ _
的列表,但没有一个接一个的顺序(此模式之间的一些ID和单词正在匹配)。有没有办法解决这个问题以获得:
[('no RN', 'estar VASI1S0', 'lavar VMP00SM'),('estar VAIP2S0','condicionar VMP00SM', 'alla VASI1S0')]
提前谢谢各位!
更新 我尝试了其他用户推荐的方法,但问题是如果我添加一个又一个模式,如:
no no RN 0.998134
estás estar VAIP2S0 1
condicionado condicionar VMP00SM 0.491858
对于s
字符串,这个问题的建议正则表达式不起作用。它们只捕捉:
[('no RN', 'estar VASI1S0', 'lavar VMP00SM')]
而不是:
[('no RN', 'estar VASI1S0', 'lavar VMP00SM'),('estar VAIP2S0','condicionar VMP00SM', 'alla VASI1S0')]
这是正确的。关于如何达到一个接一个模式输出的任何想法:
[('no RN', 'estar VASI1S0', 'lavar VMP00SM'),('estar VAIP2S0','condicionar VMP00SM', 'alla VASI1S0')]
给你:
这对你的例子很有用。你知道吗
你可以玩regex here
有点晚了,但我的也差不多:
输出:
如果将源字符串设置为Unicode字符串(
u"xxxx"
)或使用s.decode(encoding)
转换为Unicode字符串,则可以处理添加到问题更新中的重音。确保声明源文件编码:输出:
相关问题 更多 >
编程相关推荐