【问题标题】:Which pattern has been found?找到了哪种模式?
【发布时间】:2013-11-29 23:28:54
【问题描述】:

在以下错误代码中,我希望找到每个匹配项的以下信息。

  1. 已找到替代\w+\d+
  2. 找到的匹配文本中的位置。

我想将它与两个以上的基本选择一起使用。不使用蛮力有可能吗?

错误代码

#! /usr/bin/env python3

import re

pattern = re.compile(r"(\w+)|(\d+)")

text = "a word or 2, or three"

for x in pattern.findall(text):
    print(x)

输出

('a', '')
('word', '')
('or', '')
('2', '')
('or', '')
('three', '')

预期输出

('a', 0, '(\w+)')
('word', 2, '(\w+)')
('or', 7, '(\w+)')
('2', 10, '(\d+)')
('or', 13, '(\w+)')
('three', 16, '(\w+)')

【问题讨论】:

  • @projetmbc 你的意思是这样的吗? See here..
  • @HamZa 你有一个小例子吗?
  • @projetmbc Something like this (?P<word>[^\W\d_]+)|(?P<digits>\d+).
  • 它没有被明确提及,所以我要说,\w 将匹配数字,你必须像 Hamza 那样使用 [^\W\d_],或者 [A-Za-z]
  • @HamZa 在您的帮助下,我可以使用print((m.group(), m.start(), [x for x in ['word', 'digits'] if m.group(x) != None][0])) 找到比赛的名称。有没有更优雅的方式?

标签: python regex python-3.x


【解决方案1】:

感谢所有cmets,我有以下解决方案。

代码

import re

text = "a word or 2, or three"

print('---')

pattern = re.compile(r"(?P<word>[^\W\d_]+)|(?P<digits>\d+)")

for m in pattern.finditer(text):
    name = next(k for k, v in m.groupdict().items() if v)
    print((m.group(), m.start(), name))

print('---')

pattern = re.compile(r"(?P<one_word>[^\W\d_]+)|(?P<some_digits>\d+)")

for m in pattern.finditer(text):
    name = next(k for k, v in m.groupdict().items() if v)
    print((m.group(), m.start(), name))

输出

---
('a', 0, 'word')
('word', 2, 'word')
('or', 7, 'word')
('2', 10, 'digits')
('or', 13, 'word')
('three', 16, 'word')
---
('a', 0, 'one_word')
('word', 2, 'one_word')
('or', 7, 'one_word')
('2', 10, 'some_digits')
('or', 13, 'one_word')
('three', 16, 'one_word')

【讨论】:

  • name = next(k for k, v in m.groupdict().items() if v)
  • 好主意,因为不需要提供列表['word', 'digits']。我用你的把戏更新了答案。非常感谢 ! :-)
猜你喜欢
  • 2016-10-11
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多