使用正则表达式提取所有数字和单词编号

时间:2016-09-20 12:26:13

标签: python regex

我正在尝试从文本中提取所有字符串和数字。

text = 'one tweo three 10 number'
numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \
          eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \
          eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \
          ninety|hundred|thousand)"

print re.search(numbers, text).group(0)

这给了我第一个数字。

我的预期结果= ['one','two','three','10']

如何修改它以便我可以列出所有单词和井号?

2 个答案:

答案 0 :(得分:2)

这里有几个问题:

  • 该模式应与VERBOSE标志一起使用(在开始时添加(?x)
  • nine将与nine中的ninety匹配,因此您应该先设置较长的值,或使用字边界\b
  • 使用原始字符串文字声明模式,以避免将\b解析为退格而不是单词边界等问题
  • 要匹配数字,您可以将|\d+分支添加到您的号码匹配组
  • 要匹配输入字符串中多个非重叠的子字符串,您需要使用re.findall(或re.finditer),而不是re.search

这是我的建议:

import re
text = 'one two three 10 number eleven eighteen ninety  \n '
numbers = r"""(?x)          # Turn on free spacing mode
            (
              ^a(?=\s)|     # Here we match a at the start of string before  whitespace
              \d+|          # HERE we match one or more digits
              \b            # Initial word boundary 
              (?:
                  one|two|three|four|five|six|seven|eight|nine|ten| 
                  eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| 
                  eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| 
                  ninety|hundred|thousand
              )             # A list of alternatives
              \b            # Trailing word boundary
)"""

print(re.findall(numbers, text))

请参阅Python demo

这是一个regex demo

答案 1 :(得分:1)

re.findall和[0-9] +的添加对您的列表很有用。不幸的是,如果你尝试匹配七十三岁的东西,你会得到 - >七,三,因此你需要比下面更好的东西: - )

numbers = "(^a(?=\s)|one|two|three|four|five|six|seven|eight|nine|ten| \
          eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen| \
          eighteen|nineteen|twenty|thirty|forty|fifty|sixty|seventy|eighty| \
          ninety|hundred|thousand|[0-9]+)"

x = re.findall(numbers, text)