Python 和 Regex 将书面数字转换为数字
Python and Regex to convert wrtitten numbers to numeric
我正在尝试将书面数字转换为数值。
例如,要从此字符串中提取数百万:
text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'
收件人:
'I need $ 150000000, or 150000000,1000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 5 thousand'
我先用这个函数删除数字中的任何分隔符:
def foldNumbers(text):
""" to remove "," or "." from numbers """"
text = re.sub('(?<=[0-9])\,(?=[0-9])', "", text) # remove commas
text = re.sub('(?<=[0-9])\.(?=[0-9])', "", text) # remove points
return text
我编写了这个正则表达式来查找常见百万符号的所有可能模式。这 1) 找到数字并向前看 2) 数百万的通用符号,3) "[a-z]?"部分是处理可选的 "s" 百万或数百万,其中我已经删除了“'”。
re.findall(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)',text)
正确匹配 Million 数字和 returns:
['150', '1', '15', '15', '15', '15', '15', '15', '15', '15', '15']
我现在需要做的是编写一个替换模式,在数字后插入“000000”,或者遍历并将数字乘以 100000。到目前为止,我已经试过了:
re.sub(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)', "000000 ", text)
哪个returns:
'I need $ 150,000,000, or 000000 million,000000 millions, 000000 Million, 000000 million, 000000 Million, 000000 m, 000000 M, 000000 m, 000000 M, 000000 MM, 000000 MM, 5 thousand'
我想我需要做一个 look behind (?<=),但是我在几次尝试之前和之后都没有使用过它,我似乎无法解决它。
仅供参考:我的计划是先解决 "Millions",然后复制千 (K)、十亿 (B)、万亿 (T) 以及其他单位(例如距离、货币等)的解决方案. 我在 SO 和 google 中搜索了 NLP、文本清理和挖掘文章中的任何解决方案,但没有找到任何内容。
您可以使用相对简单的 re.sub
来完成此操作:匹配
(?i)\b(\d+) ?m(?:m|illions?)?\b
捕获组中的初始数字,并替换为与 6 个零连接的组:
r'\g<1>000000'
https://regex101.com/r/IedRP4/1
代码:
text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'
output = re.sub(r'(?i)\b(\d+) ?m(?:m|illions?)?\b', r'\g<1>000000', text)
(因为替换中的组后面是数字,所以make sure使用\g<#>
语法而不是\#
语法)
我正在尝试将书面数字转换为数值。
例如,要从此字符串中提取数百万:
text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'
收件人:
'I need $ 150000000, or 150000000,1000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 5 thousand'
我先用这个函数删除数字中的任何分隔符:
def foldNumbers(text):
""" to remove "," or "." from numbers """"
text = re.sub('(?<=[0-9])\,(?=[0-9])', "", text) # remove commas
text = re.sub('(?<=[0-9])\.(?=[0-9])', "", text) # remove points
return text
我编写了这个正则表达式来查找常见百万符号的所有可能模式。这 1) 找到数字并向前看 2) 数百万的通用符号,3) "[a-z]?"部分是处理可选的 "s" 百万或数百万,其中我已经删除了“'”。
re.findall(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)',text)
正确匹配 Million 数字和 returns:
['150', '1', '15', '15', '15', '15', '15', '15', '15', '15', '15']
我现在需要做的是编写一个替换模式,在数字后插入“000000”,或者遍历并将数字乘以 100000。到目前为止,我已经试过了:
re.sub(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)', "000000 ", text)
哪个returns:
'I need $ 150,000,000, or 000000 million,000000 millions, 000000 Million, 000000 million, 000000 Million, 000000 m, 000000 M, 000000 m, 000000 M, 000000 MM, 000000 MM, 5 thousand'
我想我需要做一个 look behind (?<=),但是我在几次尝试之前和之后都没有使用过它,我似乎无法解决它。
仅供参考:我的计划是先解决 "Millions",然后复制千 (K)、十亿 (B)、万亿 (T) 以及其他单位(例如距离、货币等)的解决方案. 我在 SO 和 google 中搜索了 NLP、文本清理和挖掘文章中的任何解决方案,但没有找到任何内容。
您可以使用相对简单的 re.sub
来完成此操作:匹配
(?i)\b(\d+) ?m(?:m|illions?)?\b
捕获组中的初始数字,并替换为与 6 个零连接的组:
r'\g<1>000000'
https://regex101.com/r/IedRP4/1
代码:
text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'
output = re.sub(r'(?i)\b(\d+) ?m(?:m|illions?)?\b', r'\g<1>000000', text)
(因为替换中的组后面是数字,所以make sure使用\g<#>
语法而不是\#
语法)