python - 查找正则表达式中的最后一组

标签 python regex

三个下划线分隔的元素构成我的字符串: - 第一个(字母和数字) - 中间(字母、数字和下划线) - 最后一个(字母和数字)

最后一个元素是可选的。

注意:我需要通过组名而不是索引来访问组。

示例:

String : abc_def
first : abc
middle : def
last : None

String : abc_def_xyz
first : abc
middle: def
last: xyz

String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl
last : xyz

我找不到正确的正则表达式...

到目前为止我有两个想法:

可选组

(?P<first>[a-z]+)_(?P<middle>\w+)(_(?P<last>[a-z]+))?

但是中间组匹配直到字符串末尾:

String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl_xyz
last : vide

使用“|”

(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P<first>[a-z]+)_(?P<middle>\w+)

此表达式无效:第一组和中间组声明了两次。我虽然可以编写一个表达式,重用表达式第一部分中的匹配组:

(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P=first)_(?P=middle)

表达式有效,但是只有第一个和中间的字符串(如 abc_def)不匹配。

注意

这些字符串实际上是我需要匹配的路径的一部分。它可能是这样的路径:

  • /my/path/to/abc_def
  • /my/path/to/abc_def/
  • /my/path/to/abc_def/some/other/stuf
  • /my/path/to/abc_def/some/other/stuf/
  • /my/path/to/abc_def_ghi_jkl_xyz
  • /my/path/to/abc_def_ghi_jkl_xyz/
  • /my/path/to/abc_def_ghi_jkl_xyz/some/other/stuf
  • /my/path/to/abc_def_ghi_jkl_xyz/some/other/stuf/
  • ...

有什么想法可以仅用正则表达式来解决我的问题吗?无法对匹配的组进行后处理。

非常感谢!

最佳答案

将中间组更改为非贪婪,并添加字符串开头和结尾 anchor :

^(?P<first>[a-z]+)_(?P<middle>\w+?)(_(?P<last>[a-z]+))?$

默认情况下,\w+将尽可能匹配更多,从而吃掉字符串的其余部分。添加 ? 告诉它尽可能匹配。

感谢 Tim Pietzcker 指出 anchor 要求。

关于python - 查找正则表达式中的最后一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3425330/

相关文章:

python - Django登录 "?next="只保存一个GET参数

python - 如何在scrapy spider中传递用户定义的参数

MySQL,REGEXP - 查找仅包含以下确切字母的单词

c# - 简单数字正则表达式匹配

python - 增加文件中的所有数字

python 名称正则表达式

python - 从通用标签集生成 PCFG

python - 在python中将节点插入树中

python - 如何更改标签小部件中的文本大小? (tkinter)

java - 如何使用正则表达式验证数学公式字符串?