python - 正则表达式可选匹配运算符 : how to apply to a string of characters?

标签 python ruby regex perl

我在尝试应用以下正则表达式时遇到问题:

(1234).*?(abcd)?

到下面的字符串:

1234567abcd

我的期望是上面应该产生两个匹配项:

  1. 1234
  2. abcd

但是,这不起作用。您可能会建议“好吧,只需删除尾随的 ? 字符吗?” -- 但我希望第二个模式是可选的。

这是怎么做到的?

重申一下:

(1234).*?(abcd)

... 给出了想要的结果,但我搜索的字符串并不总是包含 abcd

如果有人想知道,这是大局问题的简化示例。如果需要,我会解释。

====

我认为这个问题需要进一步澄清。这是我正在尝试用 ruby​​ 做的更完整的示例。

根据我的日志文件中的以下两行“篡改”行:

Aug 28 00:00:05 app-system-1 app-prod[7660]: Completed 200 OK in 150ms (Views: 24.6ms | ActiveRecord: 66.1ms)
Aug 28 00:05:06 app-system-1 app-prod[10639]: Completed 302 Found in 81ms (ActiveRecord: 74.6ms)

我试过用 ruby​​ 编译正则表达式如下:

d=Regexp.new('(?<timestamp>\w{1,3}\s\d{1,2}\s\d\d:\d\d:\d\d).*(?<in>in [0-9]*).*(?<views>Views: [0-9]*).*(?<activerecord>ActiveRecord: [0-9]*)')

很明显,在某些情况下,“views”文本将被包含,在其他行中,它不存在。

我希望能够做这样的事情:

v=d.match(line)
if !v.nil?
    puts v[:timestamp]+ " " + v[:in] + " " + v[:views] + " " + v[:activerecord]

这显然是一个不完整的例子,但希望这能澄清。

最佳答案

你没有具体说明你想要什么,至少没有明确说明,但我认为你想要以下内容:

  • 当给定 ...1234567abcd... 作为输入时,1234567abcd 应该匹配,并且 1234abcd 应该被捕获。
  • 当给定 ...1234567abce... 作为输入时,应该匹配 1234,应该捕获 1234

如果是这样,您可以使用:

/(1234)(?:.*?(abcd))?/s

我讨厌使用贪婪修饰符。它用于避免匹配某些序列,但不能保证它不会。我会改用以下内容:

/
   (1234)
   (?:
      (?:(?!abcd).)*    # Safer than .*?
      (abcd)
   )?
/sx

关于python - 正则表达式可选匹配运算符 : how to apply to a string of characters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12208049/

相关文章:

javascript - 无法正确设置数字格式

mysql - 查找字符串 mySQL 中匹配表达式的数量

python - Pyglet OpenGL绘图抗锯齿

python - 对 Pandas DataFrame 组内的 int 系列进行上采样

arrays - Ruby:从数组中获取连续的元素对

ruby-on-rails - Unicorn.rb 配置取决于环境

python - 在 Pandas 中添加两列时输出错误

python - 为什么 sys.getsizeof 对于非常大的列表返回相同的输出

Ruby:将 Date 和 Time 对象组合成 DateTime

Jquery 使用 RegEx 验证电子邮件