Regex捕获具有不同量词的组



我正在解析的文本包括捕获组前后以及捕获组内的星号。我确定的解析捕获组的模式基本上是:文本之前的连续星号将始终至少为30。同样,最后一个单词后面的连续星号将至少有15个字符长。捕获组中的连续星号总是小于10。我遇到的问题是,我不确定如何给捕获组中星号与组中其他字符赋予不同的量词,但将其包含在同一匹配集中。例如:

text = 'ÿÿÿÿ*************************************************CURRICULUM VITAE***Información *personal*********************ìÌ**Ì*Ì*Ì*'

所以基本上,我只需要捕获文本部分。星号可以存在于实际文本之前和之后(我稍后可以删除(,但胡言乱语不能。因此,任何一种输出都有效:

#Output #1 
CURRICULUM VITAE***Información *personal
#output #2
**********CURRICULUM VITAE***Información *personal**********

以下是我尝试过的代码,无法区分捕获组和随后的胡言乱语。不过,它确实正确地识别了文本之前的星号。

p=re.compile(r'(?<=[*]{30})([x29{,10}|u00c0-u00d6|u00d8-u00f6|u00f8-u02af|u1d00-u1d25|u1d62-u1d65|u1d6b-u1d77|u1d79-u1d9a|u1e00-u1eff|u2090-u2094|u2184-u2184|u2488-u2490|u271d-u271d|u2c60-u2c7c|u2c7e-u2c7f|ua722-ua76f|ua771-ua787|ua78b-ua78c|ua7fb-ua7ff|ufb00-ufb06|x20-x2A|x2B-x7E]+)(?=[*]{,15})', re.MULTILINE)
print(re.findall(p, text)[0])
#output
*******************CURRICULUM VITAE***Información *personal*********************ìÌ**Ì*Ì*Ì*

正如你所看到的,它在实际捕获组之前成功地切断了胡言乱语,但在捕获组之后没有切断胡言乱语。我猜上面的正则表达式写得不正确,所以\x29{,10}与其他字符一起执行,这些字符可能出现+次。

请注意,\x29是*的unicode。更改unicode字符作为解析捕获组的一种方式不是一种选择,我需要能够维护重音,这可能也存在于胡言乱语部分。

根据MAX XAPI的评论编辑

在胡言乱语之后可能有15个以上的连续星号,所以在您的代码中,它似乎是在最后15个以上连续星号处剪切的,但保留了之前的星号。因此,我需要的是,匹配要么在前15个连续星号处切入(即,捕获组后没有星号(,要么只包括捕获组后的前15个星号。例如:

p=re.compile(r'(?<=[*]{30})([^*][x2A{,10}|u00c0-u00d6|u00d8-u00f6|u00f8-u02af|u1d00-u1d25|u1d62-u1d65|u1d6b-u1d77|u1d79-u1d9a|u1e00-u1eff|u2090-u2094|u2184-u2184|u2488-u2490|u271d-u271d|u2c60-u2c7c|u2c7e-u2c7f|ua722-ua76f|ua771-ua787|ua78b-ua78c|ua7fb-ua7ff|ufb00-ufb06|x20-x2A|x2B-x7E]+[^*])(?=[*]{15,})',re.MULTILINE)
text=t='ÿÿÿÿ*************************************************CURRICULUM VITAE***Información *personal**********************ìÌ**Ì*Ì*Ì*************************************(ìÌ**Ì*Ì*Ì***************'
#output
print(re.findall(p, text))
['CURRICULUM VITAE***Información *personal**********************ìÌ**Ì*Ì*Ì']
#desired output
['CURRICULUM VITAE***Información *personal']
The following is also acceptable
['CURRICULUM VITAE***Información *personal***************']

这只使用一个否定的前瞻断言:

尝试:

*{30,}((?:[^*]|*(?!*{9}))+?)*{15,}

Regex Demo

  1. *{30,}匹配30个或更多星号
  2. (捕获组1开始
  3. (?:[^*]|*(?!*{9}))+?匹配非捕获组中的一个或多个:非星号或后面没有9个星号的星号
  4. `)'捕获组1结束
  5. *{15,}匹配15个或更多星号
import re
text = 'ÿÿÿÿ*************************************************CURRICULUM VITAE***Información *personal*********************ìÌ**Ì*Ì*Ì*'
l = re.findall(r'*{30,}((?:[^*]|*(?!*{9}))+?)*{15,}', text)
print(l)

打印:

['CURRICULUM VITAE***Información *personal']

您可以使用一个技巧,考虑到捕获组必须以*以外的其他东西开始,并且必须以相同的方式结束。因此,只需添加另一个具有两个[^*]:的容器组

(?<=[*]{30})([^*][x29{,10}|u00c0-u00d6|u00d8-u00f6|u00f8-u02af|u1d00-u1d25|u1d62-u1d65|u1d6b-u1d77|u1d79-u1d9a|u1e00-u1eff|u2090-u2094|u2184-u2184|u2488-u2490|u271d-u271d|u2c60-u2c7c|u2c7e-u2c7f|ua722-ua76f|ua771-ua787|ua78b-ua78c|ua7fb-ua7ff|ufb00-ufb06|x20-x2A|x2B-x7E]+[^*])(?=[*]{15,})

我添加/更改了:

  • 添加了两个";非CCD_ 7";在捕获组的末尾和开头:([^*] ... [^*])
  • 在结束时用CCD_ 10改变CCD_

https://regex101.com/r/m6lqP3/3

相关内容

  • 没有找到相关文章

最新更新