[英]python regex, optionally match a word
我有以下正則表達式:
PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b(\d+)
應該與以下文本匹配的內容:
ServingsPerContainer:about11
空格留有空白,以提高舒適度
這個想法是,“ Package Quantity
,“ Servings per container
servings per package
或“ servings per package
一詞后面可以緊跟任何一個詞(恰好是一個詞),例如approx.
或about
。
看起來很簡單,但是我找不到解決方案,因為上面的正則表達式匹配一個空字符串而不是數字
pythonregex.com輸出:
>>> regex = re.compile("PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b(\d+)",re.IGNORECASE)
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x672858ed0eef4da0>
>>> regex.match(string)
<_sre.SRE_Match object at 0x672858ed0ee8c6a8>
# List the groups found
>>> r.groups()
(None,)
# List the named dictionary objects found
>>> r.groupdict()
{}
# Run findall
>>> regex.findall(string)
[u'']
# Run timeit test
>>> setup = ur"import re; regex =re.compile("PackageQuantity:\b|Servings?PerContainer:\b|S ...
>>> t = timeit.Timer('regex.search(string)',setup)
>>> t.timeit(10000)
0.0259890556335
您在后面缺少可選字詞:
(PackageQuantity:|(份)?PerContainer:|(份)?PerPackage:)[a-zA-Z。] *(\\ d +)或(PackageQuantity:|(份)?PerContainer:|(份)?PerPackage: )(大約|大約)?(\\ d +)如果您的單詞列表不太長,應該可以解決這個問題
您需要在模式中包含about
或approx
。
>>> import re
>>> s = "ServingsPerContainer:about11"
>>> m = re.search(r'(?:PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b)(?:about|approx)(\d+)', s, re.I)
>>> m
<_sre.SRE_Match object at 0x7f0531c7a648>
>>> m.group()
'ServingsPerContainer:about11'
>>> m.group(1)
'11'
要么
>>> m = re.search(r'(?:PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b)\D*(\d+)', s, re.I)
>>> m.group()
'ServingsPerContainer:about11'
在您的正則表達式中,您實際上是在匹配:
您會注意到, \\d+
僅附加在這些子句的最后。
此外, \\d+
匹配1個或多個數字。 它與“ about”或“ approx”之類的內容不匹配。 \\w+
可能更像您想要的東西。 它匹配字母,數字和下划線。 就像是:
(PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b)\w+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.