【问题标题】:Regex not grabbing all groups, not working in multiline正则表达式没有抓住所有组,没有在多行中工作
【发布时间】:2014-02-27 14:31:21
【问题描述】:

我有以下正则表达式模式:

pattern = r'''
        (?P<name>.+?)\n
        SKU\s#\s+(?P<sku_hidden>\d+)\n
        Quantity:\s+(?P<quantity>\d+)\n
        Gift\sWrap:\s+(?P<gift_wrap>.+?)\n
        Shipping\sMethod:.+?\n
        Price:.+?\n
        Total:\s+(?P<total_price>\$[\d.]+)
        '''  

我使用以下方法检索它们:

re.finditer(pattern, plain, re.M | re.X)

但使用 re.findall 会产生相同的结果。

它应该匹配这样的文本:

Red Retro Citrus Juicer
SKU # 403109
Quantity: 1
Gift Wrap: No
Shipping Method:Standard
Price: $24.99
Total: $24.99

发生的第一件事是使用re.Mre.X 它不起作用,但如果我将它们放在一行中它会起作用。另一件事是,当它起作用时,只有第一组被捕获,其余的被忽略。有什么想法吗?

其他信息:

如果我将我的模式更改为:

pattern = r'''
        (?P<name>.+?)\n
        SKU\s#\s+(?P<sku_hidden>\d+)\n
        '''

我的输出是这样的:[u'Red Retro Citrus Juicer'] 它匹配但 SKU 没有出现。如果我把所有东西都放在同一行,像这样:

pattern = r'(?P<name>.+?)\nSKU\s#\s+(?P<sku_hidden>\d+)\n' 

它确实匹配并抓取所有内容。

【问题讨论】:

  • 请务必包含输入样本;什么应该匹配,什么不应该匹配?你期望什么输出?
  • 几个 cmets:1(?P&lt;gift_wrap&gt;\d+) 将匹配数字,而不是 No 2Total\sPrice: 不会匹配 Total: 3。你确定你的换行​​符都是\n而不是\r吗?顺便说一句,如果您不使用 ^$ 锚点,则不需要多行标志。
  • 正确的 1 和 2,仍然不起作用,我在应用正则表达式之前从文本中删除了所有的 \r。
  • 1。删除\r 后,您检查了我假设的换行符没有消失吗?此外,您应该编辑您的问题以反映您的更改(之前的 1 和 2),这有点误导。 2 你的正则表达式匹配很奇怪,但只捕获了第一组......你如何尝试检索它们?
  • 这就是我检索它们的方式:re.finditer(pattern, plain, re.M | re.X) 但使用 findall 会产生相同的结果。

标签: python regex regex-group


【解决方案1】:

使用X 标志时,您需要转义启动cmets 的#

现在你的两行正则表达式相当于

(?P<name>.+?)\n
SKU\s

你想要的是

pattern = r'''
    (?P<name>.+?)\n
    SKU\s\#\s+(?P<sku_hidden>\d+)\n
    Quantity:\s+(?P<quantity>\d+)\n
    Gift\sWrap:\s+(?P<gift_wrap>.+?)\n
    Shipping\sMethod:.+?\n
    Price:.+?\n
    Total:\s+(?P<total_price>\$[\d.]+)
    '''  

注意\#...

【讨论】:

  • 你这个人(y)。我的工作涉及每天使用正则表达式,但由于某种原因我没有遇到过。
  • 你打败了我。我可以更正我的答案,但否决票不太友好。
  • 愚蠢的错误 :) @MartijnPieters:没有投反对票,我遵循了与您相同的步骤。
  • 是我,讽刺的是,他根本不认为他是友好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多