当前位置: 首页 > 知识库问答 >
问题:

具有不同量词的正则表达式捕获组

乔望
2023-03-14

我正在分析的文本包括捕获组前后以及捕获组内的星号。我确定的解析捕获组的模式基本上是:文本前的连续星号总是至少为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***************']

共有2个答案

宰父正真
2023-03-14

考虑到捕获组必须以非*开头,并且必须以相同的方式结束,您可以使用一个技巧。因此,只需添加另一个包含两个[^*]的容器组:

(?<=[*]{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,})

我添加/更改了:

  • 在捕获组的末尾和开头添加了两个“非*”事件:([^*]…[^*])

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

禄和宜
2023-03-14

这只使用一个消极的前瞻断言:

尝试:

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

正则表达式演示

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

 类似资料:
  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 我有一个具有多个可选和非捕获组的正则表达式。所有这些组都可能发生,但不必发生。正则表达式应使用非捕获组返回整个字符串。 当我将最后一个组也设置为可选时,正则表达式将具有多个分组结果。当我将第一组设置为非可选时,正则表达式匹配。为什么? 输入将类似于,预期输出。 提前感谢!

  • 软件-Adobe Professional XI 编程-用正则表达式匹配通配符的JavaScript 背景-我有多个带有标题栏的pdf图纸,使用java脚本,基于单词的位置添加数字签名字段(通过与regex匹配)。 目前正在测试,看看是否有文字出现在绘图标题块的修订版1中。 脚本搜索修订号1,后面是日期、标题(字数不同)和4组缩写。 数字1是静态的(日期、标题和首字母都是通配符,因为每个图形都不同

  • 问题内容: 我有一个像 我需要一个正则表达式给我以下输出: 我努力了 但这给 问题答案: 因此,您想要(+一个整数)后跟任何内容,直到下一个(或字符串结尾),对吗? 然后,您需要告诉正则表达式引擎: 在您的正则表达式中,尽可能匹配-直到字符串结尾的所有内容。另外,您将比赛的第二部分本身做了。 我的解决方案说明:

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 本文向大家介绍所有格量词Java正则表达式,包括了所有格量词Java正则表达式的使用技巧和注意事项,需要的朋友参考一下 贪婪的量词是默认的量词。贪婪的量词从输入字符串中尽可能匹配(最长匹配),如果未发生匹配,则它离开最后一个字符并再次匹配。 所有格量词与贪婪量词相似,唯一的区别是它试图匹配最初可能匹配的尽可能多的字符,并且,如果不像贪婪量词那样发生匹配,它就不会回退。 如果将“ +”放在贪婪的量词