我正在尝试在名为网页的字符串中查找所有货币值的案例。
字符串网页是来自this网页的文字,在我的程序中它只是硬编码,因为这就是所有需要的,但我不会在这里全部粘贴。
regex = r'^[$£€]?(([\d]{1,3},([\d]{3},)*[\d]{3}|[0-9]+)(\.[0-9][0-9])?(\s?bn|\s?mil|\s?euro[s]?|\s?dollar[s]?|\s?pound[s]?|p){0,2})'
res = re.findall(regex, webpage)
print(res)
它回归[],我预计会回归[1310亿美元,1000亿英镑,1000亿美元,174亿美元]
答案 0 :(得分:2)
在不知道必须搜索的文本的情况下,您可以使用正则表达式:
([€|$|£]+[0-9a-zA-Z\,\.]+)
捕获包含€,£或$的所有内容,然后在不遵循文字或字母的情况下打印金额。请参阅此处的示例:http://rubular.com/r/a7O7AGF9Zl。
使用这个正则表达式我们得到这个代码:
import re
webpage = '''
one
million
dollars
test123
$1bn asd
€5euro
$1923,1204bn
€1293.1205 million'''
regex = r'([€|$]+[0-9a-zA-Z\,\.]+)'
res = re.findall(regex, webpage)
print(res)
输出:
['$1bn', '€5euro', '$1923,1204bn', '€1293.1205']
编辑:在提供的网站上使用相同的正则表达式,它返回输出:
['$131bn', '$100bn', '$17.4bn.', '$52.4bn']
如果您进一步修改正则表达式以查找例如5亿,您可以在第一个支架上添加0-9,然后搜索£,€,$或以0-9开头的任何内容。
输出:
webpage = '''
one
million
€1293.1205 million
500million
'''
regex = r'([€|$0-9]+[0-9a-zA-Z\,\.]+)'
因此变为:
['€1293.1205', '500million']
答案 1 :(得分:0)
正则表达式的第一个错误是字符串开头的^
,它只匹配字符串中的第一个字符,这在使用findall
时没有用。< / p>
此外,您定义了很多组(()
),我认为您并不真正需要,所以要逃避所有组(在打开的括号旁边添加?:
)和你会非常接近你想要的东西:
regex = r'[$£€](?:(?:[\d]{1,3},(?:[\d]{3},)*[\d]{3}|[0-9]+)(?:\.[0-9][0-9])?(?:\s?bn|\s?mil|\s?euro[s]?|\s?dollar[s]?|\s?pound[s]?|p){0,2})'
res = re.findall(regex, webpage)
print(res)
答案 2 :(得分:0)
网络搜索解决方案:
import urllib
import itertools
from bs4 import BeautifulSoup as soup
import re
s = soup(str(urllib.urlopen('http://www.bbc.com/news/business-41779341').read()), 'lxml')
final_data = list(itertools.chain.from_iterable(filter(lambda x:x, [re.findall('[€\$£][\w\.]+', i.text) for i in s.findAll('p')])))
输出:
[u'$131bn', u'\xa3100bn', u'$100bn', u'$17.4bn.']