Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有不同量词的正则表达式捕获组_Python_Regex_Regex Group_Quantifiers - Fatal编程技术网

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

Python 带有不同量词的正则表达式捕获组,python,regex,regex-group,quantifiers,Python,Regex,Regex Group,Quantifiers,我正在解析的文本包括捕获组前后以及捕获组内的星号。我已经确定的解析捕获组的模式基本上是:文本前的连续星号将始终至少为30。类似地,最后一个单词后的连续星号长度至少为15个字符。捕获组中的连续星号将始终小于10。我遇到的问题是,我不确定如何为捕获组中的星号与组中的其他字符指定不同的量词,但将其包含在同一匹配集中。例如: text = 'ÿÿÿÿ*************************************************CURRICULUM VITAE***Informació

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

text = 'ÿÿÿÿ*************************************************CURRICULUM VITAE***Información *personal*********************ìÌ**Ì*Ì*Ì*'
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***************']
所以基本上,我只需要捕获文本部分。星号可以存在于实际文本之前和之后(我可以稍后删除),但乱码不能。因此,要么输出工作:

#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*********************ìÌ**Ì*Ì*Ì*

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,})

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

尝试:

  • \*{30,}
    匹配30个或更多星号
  • 开始捕获组1
  • (?:[^*]\*(?!\*{9}))+?
    匹配非捕获组中的一个或多个:非星号或不后跟9个星号的星号
  • `)'捕获组1结束
  • \*{15,}
    匹配15个或更多星号
  • 印刷品:

    ['CURRICULUM VITAE***Información *personal']
    
    看这个。你不应该接受这个,因为有10个或更多的“*”。
    import re
    
    text = 'ÿÿÿÿ*************************************************CURRICULUM VITAE***Información *personal*********************ìÌ**Ì*Ì*Ì*'
    
    l = re.findall(r'\*{30,}((?:[^*]|\*(?!\*{9}))+?)\*{15,}', text)
    print(l)
    
    ['CURRICULUM VITAE***Información *personal']