Python提取可量化文本(数字)

Python提取可量化文本(数字),python,regex,nlp,Python,Regex,Nlp,您好,我想使用python并提取文本,该文本可以是数字值,也可以是拼写出来的数字加上查找到的值前后的第一个单词 示例文本: 我有两个兄弟,他们每人买了一辆车。我的老大 哥哥投资了1000美元 预期产出: “有两个兄弟”,“买了一辆车”,“投资了1000美元” 我试过这个> >>> import re >>> str = "I have 2 brothers and they bought one car each. My oldest brother inve

您好,我想使用python并提取文本,该文本可以是数字值,也可以是拼写出来的数字加上查找到的值前后的第一个单词

示例文本:

我有两个兄弟,他们每人买了一辆车。我的老大 哥哥投资了1000美元

预期产出:

“有两个兄弟”,“买了一辆车”,“投资了1000美元”

我试过这个>

>>> import re
>>> str = "I have 2 brothers and they bought one car each. My oldest brother invested 1,000 dollars."
>>> print re.findall("\d+", s)
['2']

但是,这只适用于查找一个值,而不是指定的术语
one
。我也不知道在找到单词之前和之后使用什么来获取单词。

这个又快又脏的正则表达式:

pat = re.compile(r'(\w+\s+)([\d,]+|one|two|three|four|five|six|seven|eight|nine)(\s+\w+)')

是否产生您想要的输出。当然,它只能找到用英语拼写的一位数数字。对于任意数字,您需要使用适当的解析器。但它可能足以满足您的需要。

假设数字的文本形式仅为1到10

import re

text = 'I have 2 brothers and they bought one car each. My oldest brother invested 1,000 dollars.'
text_numbers = []
numbers = re.findall(r'[0-9,\-]+|one|two|three|four|five|six|seven|eight|nine|ten', text)
for number in numbers:
    parts = text.split(number)
    first_part = parts[0].strip().split(' ')[-1]
    second_part = parts[1].strip().split(' ')[0]
    print('{} {} {}'.format(first_part, number, second_part))

对于数值,regex
\w+\b\s\b\d+(?:,\d+*\b\s\w+
将起作用。您需要为“数值”的含义写下一系列规则,因为
1000
中有一个非数字字符,但这是否意味着您想接受,比如说,
1,2,3,4
作为数值?同样,您需要为“数字拼写”的含义编写规则。例如,
四十二
四十二
这两个数字都拼写出来了吗<代码>251?一旦这样做,您就可以将其转换为正则表达式,但它可能会非常复杂和难看。@Matt.G使用
\w
\d+(?:,\d+)*
似乎。@abarnert,感谢您发现错误。更新的regex
[A-Za-z]+\b\s\b\d{1,3}(?:,\d{3})*\b\s[A-Za-z]+
将起作用。谢谢您,这是我需要的确切用例。我稍微修改了一下。你知道如何添加以查找“98%”,数字后面跟一个%符号吗?你可以只在正则表达式第二个括号的开头添加
\d+%|
。既然你已经在正则表达式中分别定义了这三个部分,而且你可以只使用三个
(组)
,为什么还要使用
str.split
?@abarnert你说得对。frapadingue的解决方案正是如此。