[英]How to properly regex match the following string in python?
我有以下字符串:
1-幼胡萝卜(4个孩子)(3美元)[额外0计数]; [需要5个计数]
我正在尝试以下小组:
Item - 1
Food - Baby Carrots (4Kids) (3 DOLLARS)
Cost - 3
Extra - 0
required - 5
以下是我当前的匹配字符串,未接收任何内容:
'(?P<item>.+?)\-(?P<food>.*)\[.*?(?P<extra>\d+(\.\d+)?).*\].*\[.*?(?P<required>\d+(\.\d+)?).*\]'
我的尝试有什么问题?
您原来的正则表达式:
(?P<item>.+?)\-(?P<food>.*)\[.*?(?P<extra>\d+(\.\d+)?).*\].*\[.*?(?P<required>\d+(\.\d+)?).*\]
您的问题主要是由于您搜索的是任何字符,而不是特定的字符(数字和静态字符串)。 例如:为什么使用
(?P<item>.+?)
如果只是数字? 更改为
(?P<item>[0-9]+?)
在这种情况下,不需要'+?':不需要运算符 ,因为您总是需要完整的数字。 也就是说,比赛的下一部分将不在该数字的中间 。
另外,这应该锚定到行(输入)start :
^(?P<item>[0-9]+?)
您无需逃脱破折号(尽管它不会造成伤害)。
^(?P<item>[0-9]+?)-
您的食物组(嘿)是最复杂的部分
(?P<food>.*)
它不仅包含任何字符。 根据您的演示输入,它只有字母,空格,数字和括号。 因此,只搜索它们:
(?P<food>[\w0-9 ()]+)
到目前为止,这里是:
^(?P<item>[0-9]+?)- (?P<food>[\w0-9 ()]+)
您会看到这也与成本部分相匹配(正则表达式中完全缺少这部分...我想这只是一个疏忽)。
所以加上成本,这是
(
[space]DOLLARS)
但是只捕获数字:
^(?P<item>[0-9]+?)- (?P<food>[\w0-9 ()]+) \((?P<cost>[0-9]+) DOLLARS\)
实际上,您的正则表达式的其余部分都可以正常工作,并且可以按原样添加到末尾:
\[.*?(?P<extra>\d+(\.\d+)?).*\].*\[.*?(?P<required>\d+(\.\d+)?).*\]
但是,我建议更改.*?
如果确实总是在此处找到该文本,则返回EXTRA[space]
(同样,在这种情况下,无需勉强)。 与[space]COUNT
相同;
和REQUIRED[space]
。 缩小范围越多,则正则表达式将越容易调试-假设您的输入确实受到限制。
这是最终版本(还带有行尾锚):
^(?P<item>[0-9]+?)- (?P<food>[\w0-9 ()]+) \((?P<cost>[0-9]+) DOLLARS\) \[EXTRA (?P<extra>\d+(\.\d+)?) COUNT\]; \[REQUIRED (?P<required>\d+(\.\d+)?) COUNT\]$
在分析您的正则表达式之前,这是我想到的:
(?P<item>[0-9]+)- (?P<food>[\w ()]+) \((?P<cost>[0-9]+) DOLLARS\) \[EXTRA (?P<extra>[0-9]+) COUNT\]; \[REQUIRED (?P<required>[0-9]+) COUNT\]
所有这些链接来自“ 堆栈溢出正则表达式常见问题解答” 。
像这样 :
(?P<item>.+?)\-\s(?P<food>.*?\)).*?\((?P<cost>\d)\s\w+\)\s\[.*?(?P<extra>\d+(\.\d+)?).*\].*\[.*?(?P<required>\d+(\.\d+)?).*\]
演示在这里: http : //regex101.com/r/qD1rL9
如上所述,您缺少成本捕获功能,还需要使food
捕获功能不贪心,并包括结束日期。 我的版本:
(?P<Item>\d)-\s*(?P<Food>.*?\))\s*\((?P<Cost>\d*).*EXTRA\s*(?P<Extra>\d*).*REQUIRED\s*(?P<Required>\d*)
{'Food': 'Baby Carrots (4Kids)', 'Item': '1', 'Required': '5', 'Extra': '0', 'Cost': '3'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.