我使用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之间。怎样才能达到这个效果呢?
另外,出于好奇,是否有可能在给定的文本中获得所有可能的匹配--例如- UU24230MH2004PTC147574值可以有多个匹配,可以使用提供的字符串以及上面提到的长度限制?
我知道我可以使用列表理解来实现它的一些功能,但希望regex为我做到这一点,因为我有复杂的regex查询字符串,而这只是总体上的一小部分。
谢谢大家
发布于 2021-05-11 07:21:47
我们可以使用前瞻性断言匹配字符串的长度在19到21个字符之间。
(?=\S{19,21}\s)U\S*\d{5}\S*
然而,这依赖于在空白之前有19-21个字符。
因此,在UU24230MH2004PTC147574
的情况下,它将匹配U24230MH2004PTC147574
并忽略第一个U
。
re.findall(r'(?=\S{19,21}\s)U\S*\d{5}\S*', text)
#['U18101MH1988PTCO50073', 'U24230MH2004PTC147574', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']
发布于 2021-05-11 07:30:35
您可以使用
(?<!\S)(?=\S{19,21}(?!\S))U\S*\d{5}\S*\d(?!\S)
见regex演示。
详细信息
(?<!\S)
-左手空白边界(?=\S{19,21}(?!\S))
--就在右边,必须有19、20或21个非空格字符,后面跟着空格或字符串的末尾。U
-一个U
字符\S*
-零或多个非空白字符\d{5}
-五位数\S*
-零或多个非空白字符\d
-一个数字(?!\S)
--就在右边,应该有一个空格或字符串的结尾。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))U\S*\d{5}\S*\d(?!\S)',text) )
输出:
['U18101MH1988PTCO50073', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']
发布于 2021-05-11 07:28:07
这个regex起作用:
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])
https://stackoverflow.com/questions/67489442
复制相似问题