未能捕获第一个单词组

2024-06-01 09:42:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为以下可能的情况编写正则表达式。我使用re.finditer()re.IGNORECASE来匹配字符串。可能的情况和相应的匹配是

  1. 'vessel eta: 12-10-19'应与'vessel eta: '匹配
  2. 'vessel eta 12-10-19'应与'vessel eta '匹配
  3. 'etd eta : 12/10/19'应与'etd eta '匹配
  4. 'eta SIN: 12/10/19'应与'eta SIN:'匹配
  5. 'eta : 12-10-19应与'eta :'匹配
  6. 'eta: 12-10-19'应与'eta: '匹配
  7. 'eta. 12-10-19'应与'eta. '匹配
  8. 'eta 12-10-19'应与'eta '匹配

到现在为止,我写了这样一段话:

((vessel)|(ETD))?(\s\.\:)?(ETA)[\s\.\:]{1,3}?(SIN)?[\s\.\:]?

但根据regex101,这与除前三种情况外的所有情况都匹配,其中第一个单词(无论是'vessel'还是'etd')都没有被捕获。你知道吗

我的正则表达式怎么了?你知道吗


Tags: 字符串re情况sin单词etaetdvessel
2条回答

(\s\.\:)?模式匹配一个空格、一个点和一个冒号的可选序列,而您需要匹配一个可选字符,whtespace、.:。你知道吗

请注意,您在character类中使用了overscape字符:[.]始终匹配一个点,:不是特殊的regex元字符。你知道吗

如果您不需要进一步访问正则表达式匹配项的部分,或者在分组括号不包含替代项或未量化时完全删除分组括号,则建议使用non-capturing groups(?:...))。你知道吗

你可以用

(?:vessel|ETD)?[\s.:]?ETA[\s.:]{1,3}?(?:SIN)?[\s.:]?

参见regex demo。你知道吗

正则表达式应该首先匹配输入开头的可选字符串“vessel”或“etd”:

(vessel|etd)?

然后它应该匹配单词“ETA”,后跟冒号:

(vessel|etd)?(eta:)

我假设其余部分包含一个简单的日期格式,可以通过以下方式获取:

(vessel|etd)?(eta:)(\d\d-\d\d-\d\d)

不过,上面的正则表达式是错误的:它不匹配任何空格,只匹配像埃特德塔:12-31-13". 我们需要插入"\s+"的一些实例,它转换为“至少一个空白字符”:

(vessel\s+|etd\s+)?(eta\s+:\s+)(\d\d-\d\d-\d\d)

相关问题 更多 >