我正在尝试从文本中提取所有字符串和数字。
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']
如何修改它以便我可以列出所有单词和井号?
答案 0 :(得分:2)
这里有几个问题:
(?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)