Python在String中查找正则表达式

时间:2017-12-14 14:30:34

标签: python regex

我正在尝试在名为网页的字符串中查找所有货币值的案例。

字符串网页是来自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亿美元]

3 个答案:

答案 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.']