我正在为以下可能的情况编写正则表达式。我使用re.finditer()
和re.IGNORECASE
来匹配字符串。可能的情况和相应的匹配是
'vessel eta: 12-10-19'
应与'vessel eta: '
匹配'vessel eta 12-10-19'
应与'vessel eta '
匹配'etd eta : 12/10/19'
应与'etd eta '
匹配'eta SIN: 12/10/19'
应与'eta SIN:'
匹配'eta : 12-10-19
应与'eta :'
匹配'eta: 12-10-19'
应与'eta: '
匹配'eta. 12-10-19'
应与'eta. '
匹配'eta 12-10-19'
应与'eta '
匹配到现在为止,我写了这样一段话:
((vessel)|(ETD))?(\s\.\:)?(ETA)[\s\.\:]{1,3}?(SIN)?[\s\.\:]?
但根据regex101,这与除前三种情况外的所有情况都匹配,其中第一个单词(无论是'vessel'
还是'etd'
)都没有被捕获。你知道吗
我的正则表达式怎么了?你知道吗
(\s\.\:)?
模式匹配一个空格、一个点和一个冒号的可选序列,而您需要匹配一个可选字符,whtespace、.
或:
。你知道吗请注意,您在character类中使用了overscape字符:
[.]
始终匹配一个点,:
不是特殊的regex元字符。你知道吗如果您不需要进一步访问正则表达式匹配项的部分,或者在分组括号不包含替代项或未量化时完全删除分组括号,则建议使用non-capturing groups(
(?:...)
)。你知道吗你可以用
参见regex demo。你知道吗
正则表达式应该首先匹配输入开头的可选字符串“vessel”或“etd”:
然后它应该匹配单词“ETA”,后跟冒号:
我假设其余部分包含一个简单的日期格式,可以通过以下方式获取:
不过,上面的正则表达式是错误的:它不匹配任何空格,只匹配像埃特德塔:12-31-13". 我们需要插入
"\s+"
的一些实例,它转换为“至少一个空白字符”:相关问题 更多 >
编程相关推荐