繁体   English   中英

如何正确正则表达式匹配python中的以下字符串?

[英]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+)?).*\]

正则表达式可视化

Debuggex演示

您的问题主要是由于您搜索的是任何字符,而不是特定的字符(数字和静态字符串)。 例如:为什么使用

(?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 ()]+)

正则表达式可视化

Debuggex演示

您会看到这也与成本部分相匹配(正则表达式中完全缺少这部分...我想这只是一个疏忽)。

所以加上成本,这是

  • (
  • 一个号码
  • [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\]$

正则表达式可视化

Debuggex演示


在分析您的正则表达式之前,这是我想到的:

(?P<item>[0-9]+)- (?P<food>[\w ()]+) \((?P<cost>[0-9]+) DOLLARS\) \[EXTRA (?P<extra>[0-9]+) COUNT\]; \[REQUIRED (?P<required>[0-9]+) COUNT\]

正则表达式可视化

Debuggex演示


所有这些链接来自“ 堆栈溢出正则表达式常见问题解答”

像这样 :

(?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'}

使用http://www.pythonregex.com/似乎更快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM