首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python -如何将给定的Regex模式限制在一个字符范围内

Python -如何将给定的Regex模式限制在一个字符范围内
EN

Stack Overflow用户
提问于 2021-05-11 07:04:21
回答 3查看 407关注 0票数 2

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

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

对于例如-我们使用{a,b}来定义指定字符的下界和上界。如何将相同的逻辑应用于完整的模式。

我有以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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查询字符串,而这只是总体上的一小部分。

谢谢大家

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-11 07:21:47

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(?=\S{19,21}\s)U\S*\d{5}\S*

然而,这依赖于在空白之前有19-21个字符。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re.findall(r'(?=\S{19,21}\s)U\S*\d{5}\S*', text)
#['U18101MH1988PTCO50073', 'U24230MH2004PTC147574', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']

Regex101

票数 2
EN

Stack Overflow用户

发布于 2021-05-11 07:30:35

您可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(?<!\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) --就在右边,应该有一个空格或字符串的结尾。

Python演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) )

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['U18101MH1988PTCO50073', 'U15100MH2004PTC148619', 'U70200MH2011PTC221779', 'U15130MH2004P1C14/013']
票数 1
EN

Stack Overflow用户

发布于 2021-05-11 07:28:07

这个regex起作用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
U.*\d{5}.*\d(?=\s)(?<=\S{19})(?<!\S{22})

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

测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67489442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文