首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解组和正则表达式

理解组和正则表达式
EN

Stack Overflow用户
提问于 2021-05-27 11:24:01
回答 2查看 58关注 0票数 1

我在寻找像“一年”、“两年”、"2-3年“或”3-4年“这样的长串词。我试着用正则表达式来完成它。但我不确定当团体参与的时候我是否得到了它。

让我们看看我的意思:

代码语言:javascript
运行
复制
import re

text = 'one year, honey 2-5 year, dressed six, ten'
pattern = r'(one|two|three|four|five|six|seven|eight|nine|ten| \
                  eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \
                  eighteen|nineteen|twenty|[0-9]+[- ]*[0-9]*)[+ ]*year?'

re.findall(pattern, text)  # ['one', '2-5']

我的问题是我想要['one year', '2-5 years']。我不知道该怎么做。如果我忘了单词里的数字:

代码语言:javascript
运行
复制
pattern = r'[0-9]+[- ]*[0-9]*[\+ ]*year?'
re.findall(pattern, text)  # ['2-5 years']

为什么我把years放在第二位而不是第一位?我怎么才能把它修改成在第一次有几年的时间呢?

提前谢谢你,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-27 11:30:41

您需要先修复模式以匹配数字。下面是一个示例:

代码语言:javascript
运行
复制
>>> pattern = r'''(?x)\b(?:[0-9]+(?:[- ]*[0-9]+)?|one|two|three|four|five|six|seven|eight|nine|ten
|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)
[+ ]*years?\b'''
>>> re.findall(pattern, text)
['one year', '2-5 year']

请参阅Python演示regex演示

详细信息

  • (?x) - re.X / re.VERBOSE内联改性剂
  • \b -一个单词边界
  • (?: -非捕获组的开始
    • [0-9]+(?:[- ]*[0-9]+)? -一个或多个数字后面跟着零或多个空格或-,然后是一个或多个数字
    • |one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty -替换列表中的一个单词

  • 非捕获组的)
  • [+ ]* -零或多个+或空格
  • years? - yearyears
  • \b -一个词的边界。
票数 1
EN

Stack Overflow用户

发布于 2021-05-27 12:10:23

在正则表达式中,year?应该是years?,因为它是可选的最终"s“,而不是"r”。您还需要使用所谓的非捕获组(?: ... )来获得与整个正则表达式匹配的字符串;否则,您将只获得由括号大小的子表达式匹配的字符串。

为了提高可读性,最好将长正则表达式划分为子表达式,并给它们取有意义的名称。试试这个:

代码语言:javascript
运行
复制
import re

text = 'one year, honey 2-5 year, dressed six, ten'
numberWordsRe = r'one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty'
numberOrIntervalRe=r'\d+(?:\s*-\s*\d+)'
pattern = r'\b(?:' + numberWordsRe + r'|' + numberOrIntervalRe + r')\s+years?\b'

print re.findall(pattern, text)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67721157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档