正则表达式匹配斜杠之间的条目,但不匹配包含空条目的斜杠

2024-05-23 05:59:50 发布

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

我正在尝试使用regexp来匹配以下文本中斜杠之间的条目:

311102Z/5663.00N/00813.02E/GPS//03/-/

对于本例,结果应该是一系列具有以下内容的匹配:

  • 311102Z
  • 5663.00N
  • 00813.02E
  • GPS
  • (空字符串)
  • 03
  • -

捕获空条目并返回空匹配项是很重要的。不幸的是,由于各种原因,我们不能在这里使用分组,也不能匹配斜杠本身并在这些斜杠上拆分

我有下面的正则表达式,它几乎可以工作:(.*?)(?=/)。这个正则表达式的交互显示可以看到here。它可以很好地匹配所有条目,但在每个条目的末尾有额外的空匹配项

我试图用^ {< CD9>}替换^ {< CD8>},但这当然意味着它与空白条目不匹配。

有人知道我能做些什么来让它匹配我想要的方式吗?即没有这些额外的空匹配,但是在斜杠之间没有字符的位置有空条目

如果这关系到兼容性,我将在Python中使用这个正则表达式


Tags: 字符串文本目的here条目原因gpsregexp
3条回答

或者,您可以将除/之外的任何字符匹配1+倍,并在右侧断言一个/

或者获得两个前斜杠之间的位置

[^/]+(?=/)|(?<=/)(?=/)

解释

  • [^/]+(?=/)匹配除/之外的任何字符的1+倍,并在右侧断言一个/
  • |
  • (?<=/)(?=/)获取两个正斜杠之间的位置

Regex demoPython demo

示例代码

import re
 
s="311102Z/5663.00N/00813.02E/GPS//03/-/"
pattern = r"[^/]+(?=/)|(?<=/)(?=/)"
print(re.findall(pattern, s))

输出

'311102Z', '5663.00N', '00813.02E', 'GPS', '', '03', '-']

还有一个(Python):

(?<=/)(?=/)|[^/]+

Start your engine!

(?<=/)  : use a positive lookbehind to assert match is preceded by '/'
(?=/)   : use a positive lookahead to assert match is followed by '/'
|       : or
[^/]+   : match 1+ characters other than '/'

[^/]+更改为[^/\n]+,以防止匹配项跨越行终止符

您可以将此正则表达式与前向和后向断言一起使用:

(?:(?<=/)|^)[^/]*(?=/)

RegEx Demo

代码:

>>> import re
>>> s = '311002Z/3623.00N/00412.02E/GPS//03/-/'
>>> print (re.findall(r'(?:(?<=/)|^)[^/]*(?=/)', s))
['311002Z', '3623.00N', '00412.02E', 'GPS', '', '03', '-']

正则表达式详细信息:

  • (?:(?<=/)|^):lookback断言我们在前面的位置有start或/
  • [^/]*:匹配0个或多个非/字符
  • (?=/):Lookahead断言我们前面有一个/

相关问题 更多 >

    热门问题