Python-Regex-如何将给定的正则表达式模式限制为一个字符范围



我使用python执行一些文本分析,并使用regex从文本中获取所需的模式。

我想知道,如何将模式限制为指定的字符数。

例如,我们使用{a,b}来定义指定字符的下界和上界。同样的逻辑怎么能应用于一个完整的模式呢。

我有以下代码:

import re
text = '''
547 U18101MH1988PTCO50073 =RAINBOW GARMENTS AND EXPORTS (INDIA) PRI
548 UU24230MH2004PTC147574 RAINBOW HERBAL AND RESEARCH PRIVATE LIMI
549 U55200MH1992PTCO067327 RAINBOW HOLIDAY-INNPVT.LTD.
550 U15100MH2004PTC148619 RAINBOW HORTICULTURE PRIVATE LIMITED
551 US9S99S9MH2000PTC124660 RAINBOW INFOTECH (INDIA) PRIVATE LIMITED
552 U70200MH2011PTC221779 RAINBOW INFRAVENTURES PRIVATE LIMITED
553 U15130MH2004P1C14/013 RAINBOW JELSTAR FOODS PRIVATE LIMITED
'''
re.findall('U.*d{5}.*d',text)

这个输出会给我一个文本中的值列表。我想将列表中单个值的长度限制在19到21之间。我怎样才能达到这个结果?

此外,出于好奇,是否有可能在给定的文本中获得所有可能的匹配-例如,UU24230MH2004PTC1147574值可以使用提供的字符串以及上述长度限制进行多次匹配?

我知道我可以使用列表理解来实现一些功能,但我希望regex为我做到这一点,因为我有复杂的regex查询字符串,而这只是整体的一个小部分。

谢谢大家

我们可以使用前瞻来断言匹配字符串的长度在19到21个字符之间。

(?=S{19,21}s)US*d{5}S*

然而,这取决于空白之前有19-21个字符。

因此,在UU24230MH2004PTC147574的情况下,它将匹配U24230MH2004PTC147574并忽略第一个U


re.findall(r'(?=S{19,21}s)US*d{5}S*', text)
#['U18101MH1988PTCO50073', 'U24230MH2004PTC147574', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']

Regex101

您可以使用

(?<!S)(?=S{19,21}(?!S))US*d{5}S*d(?!S)

请参阅regex演示。

详细信息

  • (?<!S)-左侧空白边界
  • (?=S{19,21}(?!S))-紧挨着右边,必须有19、20或21个非空白字符,后跟空白或字符串结尾
  • U-一个U字符
  • S*-零个或多个非空白字符
  • d{5}-五位数
  • S*-零个或多个非空白字符
  • d-一位数字
  • (?!S)-右边应该有空白或字符串末尾

请参阅Python演示:

import re
text = '''

547 U18101MH1988PTCO50073 =RAINBOW GARMENTS AND EXPORTS (INDIA) PRI
548 UU24230MH2004PTC147574 RAINBOW HERBAL AND RESEARCH PRIVATE LIMI
549 U55200MH1992PTCO067327 RAINBOW HOLIDAY-INNPVT.LTD.

550 U15100MH2004PTC148619 RAINBOW HORTICULTURE PRIVATE LIMITED

551 US9S99S9MH2000PTC124660 RAINBOW INFOTECH (INDIA) PRIVATE LIMITED
552 U70200MH2011PTC221779 RAINBOW INFRAVENTURES PRIVATE LIMITED
553 U15130MH2004P1C14/013 RAINBOW JELSTAR FOODS PRIVATE LIMITED
'''

print( re.findall(r'(?<!S)(?=S{19,21}(?!S))US*d{5}S*d(?!S)',text) )

输出:

['U18101MH1988PTCO50073', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']

此正则表达式有效:

U.*d{5}.*d(?=s)(?<=S{19})(?<!S{22})

我们需要在比赛结束时添加空格要求,然后确保比赛前至少有19个非空格字符,不超过21个。

测试代码:

values = re.findall('U.*d{5}.*d',text)
restrictedValues = [x for x in values if 21 >= len(x) >= 19]
print(values)
print ([len(x) for x in values ])
print(restrictedValues)
print ([len(x) for x in restrictedValues ])
restricted2 = re.findall('U.*d{5}.*d(?=s)(?<=S{19})(?<!S{22})',text)
print(restricted2)
print([len(x) for x in restricted2])

最新更新