我在寻找像“一年”、“两年”、"2-3年“或”3-4年“这样的长串词。我试着用正则表达式来完成它。但我不确定当团体参与的时候我是否得到了它。
让我们看看我的意思:
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']。我不知道该怎么做。如果我忘了单词里的数字:
pattern = r'[0-9]+[- ]*[0-9]*[\+ ]*year?'
re.findall(pattern, text) # ['2-5 years']为什么我把years放在第二位而不是第一位?我怎么才能把它修改成在第一次有几年的时间呢?
提前谢谢你,
发布于 2021-05-27 11:30:41
您需要先修复模式以匹配数字。下面是一个示例:
>>> 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']详细信息
(?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? - year或years\b -一个词的边界。发布于 2021-05-27 12:10:23
在正则表达式中,year?应该是years?,因为它是可选的最终"s“,而不是"r”。您还需要使用所谓的非捕获组(?: ... )来获得与整个正则表达式匹配的字符串;否则,您将只获得由括号大小的子表达式匹配的字符串。
为了提高可读性,最好将长正则表达式划分为子表达式,并给它们取有意义的名称。试试这个:
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)https://stackoverflow.com/questions/67721157
复制相似问题