使用regex从python中的字符串中提取多个值

时间:2017-04-20 15:57:19

标签: python regex string

我有多个字符串,看起来像这样 product: green apples price: 2.0 country: france company: somecompany。某些字符串可能包含较少的字段例如,一些人缺少公司名称或国家等。我试图仅提取价值并跳过产品,价格,国家,公司。我试图创建多个正则表达式,从每个字符串的左侧开始。

blah="product: green apples price: 2.0 country: france company: somecompany"

product_reg = re.compile(r'.*?\bproduct\b:(.*).*')
product_reg_strip = re.compile(r'(.*?)\s[a-z]:?')

product_full=re.findall(product_reg, blah)
prod=re.find(product_reg_strip, str(product_full))
print prod

price_reg = re.compile(r'.*?\bprice\b:(.*).*')
price_reg_strip = re.compile(r'(.*?)\s[a-z]:?')

price_full=re.findall(price_reg, blah)
price=re.find(price_reg_strip, str(price_full))
print price

但这不起作用。我该怎么做才能使这个正则表达式更加清晰?

3 个答案:

答案 0 :(得分:1)

您只需使用正则表达式并获取命名组结果即可。 你也可以拥有或不是你所要求的所有值,正则表达式在所有情况下都可以正常工作。 尝试在regex101.com上使用此全局多行regexp https://regex101.com/r/iccVUv/1/

^(?:product:(?P<product>.*?))(?:price:(?P<price>.*?))?(?:country:(?P<country>.*?))?(?:company:(?P<company>.*))?$

在python中你可以这样做:

pattern = '^(?:product:(?P<product>.*?))(?:price:(?P<price>.*?))?(?:country:(?P<country>.*?))?(?:company:(?P<company>.*))?$'
matches = re.search(pattern, 'product: green apples price: 2.0 country: italy company: italian company')

现在您可以使用以下方式获取数据:

product = matches.group('product')

您最终只需检查匹配是否满足并修剪空格,如:

if matches1.group('product') is not None:
  product = matches.group('product').strip()

答案 1 :(得分:0)

您可以像这样拆分字符串:

str = "product: green apples price: 2.0 country: france company: somecompany"
p = re.compile(r'(\w+:)')
res = p.split(str)
print res
for i in range(len(res)):
    if (i%2):
        print res[i],' ==> ',res[i+1]

<强>输出:

['', 'product:', ' green apples ', 'price:', ' 2.0 ', 'country:', ' france ', 'company:', ' somecompany']

product:  ==>   green apples 
price:  ==>   2.0 
country:  ==>   france 
company:  ==>   somecompany

答案 2 :(得分:0)

我并不完全确定你的目标是什么,但是如果你要删除的东西是单个单词后跟冒号,那么正则表达式就很容易了。以下是几个样本。

>>> import re
>>> blah="product: green apples price: 2.0 country: france company: somecompany"
>>> re.sub(r'\w+: ?', '', blah)
'green apples 2.0 france somecompany'
>>> re.split(r'\w+: ?', blah)[1:]
['green apples ', '2.0 ', 'france ', 'somecompany']