Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式,可选地匹配一个单词_Python_Regex - Fatal编程技术网

python正则表达式,可选地匹配一个单词

python正则表达式,可选地匹配一个单词,python,regex,Python,Regex,我有以下正则表达式: PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b(\d+) 应该与以下文本匹配: ServingsPerContainer:about11 为了舒适起见,省略了空白 其思想是,包装数量、每个集装箱的服务量或每个包装的服务量可以后跟任何单词(正好一个单词),例如大约,或关于 看起来很简单,但我找不到解决方案,因为上面的正则表达式匹配的是一个空字符串而不是数字 pythonregex.com

我有以下正则表达式:

PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b(\d+)
应该与以下文本匹配:

ServingsPerContainer:about11
为了舒适起见,省略了空白

其思想是,
包装数量
每个集装箱的服务量
每个包装的服务量
可以后跟任何单词(正好一个单词),例如
大约
,或
关于

看起来很简单,但我找不到解决方案,因为上面的正则表达式匹配的是一个空字符串而不是数字

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
>regex=re.compile(“包装数量:\b |服务?PerContainer:\b |服务?PerPackage:\b(\d+),re.IGNORECASE)
>>>r=regex.search(字符串)
>>>r
>>>regex.match(字符串)
#列出找到的组
>>>r.团体()
(无)
#列出找到的命名字典对象
>>>r.groupdict()
{}
#跑芬德尔
>>>regex.findall(字符串)
[u']
#运行时IT测试
>>>setup=ur“导入re;regex=re.compile(“PackageQuantity:\b | Servings?PerContainer:\b | S…”。。。
>>>t=timeit.Timer('regex.search(string'),设置)
>>>t.timeit(10000)
0.0259890556335

您缺少
后面的可选单词:


或者如果你的单词列表不太长,那么你应该在你的模式中加入
关于
大约

>>> 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'

在正则表达式中,您可以有效地匹配:

  • 包装数量:\b
  • 服务?PerContainer:\b
  • 服务?每个包:\b(\d+)
您会注意到,
\d+
仅附加到这些子句的最后一个

另外,
\d+
匹配一个或多个数字。它将不匹配“about”或“about”之类的内容。
\w+
可能更像您要查找的内容。它匹配字母、数字和下划线。类似于:

(PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b)\w+

如果你对一个问题投了反对票,你也可以留下一条评论mhm,i wan来匹配数字,在这1个表示数字准确性的单词之后,在这种情况下,你可以使用
\w+
,而不是
\w+\d
,这将确保单词末尾至少有一位字符匹配。在“about11”的情况下,则
\w+
将匹配“about1”,而\d将匹配“1”,但除非您需要使用捕获组,否则这应该无关紧要。如果确实需要使用组分别捕获精确的单词和数字,您可能需要使用类似以下内容:
(\w+?)(\d+)
取而代之。这对我很有用,还有一些python:servings=''.join(servings[-2:])if servings[-2].isdigit()\else servings[-1].strip()谢谢,但是这里可以出现大量的单词,而不是
近似值
关于
的单词,这些都不是示例
(PackageQuantity:\b|Servings?PerContainer:\b|Servings?PerPackage:\b)\w+