在正则表达式中保留引用的问题?

2024-09-28 21:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的字符串ss字符串由word_1后跟word_2id组成:

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

Tags: no字符串模式vmerrorrncsque
3条回答

给你:

^[\w]* (\w* RN) \d(?:\.\d*)?$\s^[^\s]* (\w* VA[^\s]*) \d(?:\.\d*)?$\s^[^\s]* (\w* VM[^\s]*) \d(?:\.\d*)?$
(?:\s*\S+ (\S+ RN\S*)(?:\s*\S*))\n(?: *\S+ (\S+ VA\S*)(?:\s*\S*))\n(?: *\S+ (\S+ VM\S*)(?: *\S*))

这对你的例子很有用。你知道吗

In [40]: s = '''
   ....:     No no RN 0.998045
   ....:     sabía saber VMII3S0 0.592869


   ....:     . . Fp 1
   ....:     '''

In [41]: import re

In [42]: p = re.compile(ur'(?:\s*\S+ (\S+ RN\S*)(?:\s*\S*))\n(?: *\S+ (\S+ VA\S*)(?:\s*\S*))\n(?: *\S+ (\S+ VM\S*)(?: *\S*))')

In [43]: re.findall(p, s)
Out[43]:
[('no RN', 'estar VAIP2S0', 'condicionar VMP00SM'),
 ('no RN', 'estar VASI1S0', 'lavar VMP00SM')]

你可以玩regex here

有点晚了,但我的也差不多:

import re
print re.findall(r'\w+ (\w+ RN.*)\n\s*\w+ (\w+ VA.*)\n\s*\w+ (\w+ VM.*)',s)

输出:

[('no RN', 'estar VASI1S0', 'lavar VMP00SM')]

如果将源字符串设置为Unicode字符串(u"xxxx")或使用s.decode(encoding)转换为Unicode字符串,则可以处理添加到问题更新中的重音。确保声明源文件编码:

# coding: utf8
import re

s = u'''
    (big string in question)
    '''

print re.findall(ur'\w+ (\w+ RN.*)\n\s*\w+ (\w+ VA.*)\n\s*\w+ (\w+ VM.*)',s,re.UNICODE)

输出:

[(u'no RN 0.998134', u'estar VAIP2S0 1', u'condicionar VMP00SM 0.491858'), (u'no RN 1', u'estar VASI1S0 0.908900', u'lavar VMP00SM 0.9080972')]

相关问题 更多 >