三个下划线分隔的元素构成我的字符串: - 第一个(字母和数字) - 中间(字母、数字和下划线) - 最后一个(字母和数字)
最后一个元素是可选的。
注意:我需要通过组名而不是索引来访问组。
示例:
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/