我有一个像这样的字符串列表:
/soccer/poland/ekstraklasa-2008-2009/results/
/soccer/poland/orange-ekstraklasa-2007-2008/results/
/soccer/poland/orange-ekstraklasa-youth-2010-2011/results/
从每个字符串中我想分别得到一个中间部分:
ekstraklasa
orange ekstraklasa
orange ekstraklasa youth
我的代码在这里完成了工作,但感觉它可以用更少的步骤完成,并且可能仅使用正则表达式。
name = re.search('/([-a-z\d]+)/results/', string).group(1) # take the middle part
name = re.search('[-a-z]+', name).group() # trim numbers
if name.endswith('-'):
name = name[:-1] # trim tailing `-` if needed
name = name.replace('-', ' ')
有人能看出如何让它变得更好吗?
答案 0 :(得分:1)
这个正则表达式应该做的工作:
/(?:\/\w+){2}\/([\w\-]+)(?:-\d+){2}/
说明:
(?:\/\w+){2}
- 吃/
\/
- 吃下一个/
([\w\-]+)
- 匹配连字符的字符(这是我们正在寻找的)(?:-\d+){2}
- 在我们正在寻找的部分之后吃连字符和数字结果在第一个匹配组
答案 1 :(得分:1)
我无法测试它,因为我没有使用python,但我会使用像
这样的表达式^(/soccer/poland/)([a-z\-]*)(.*)$
或
^(/[a-z]*/[a-z]*/)([a-z\-]*)(.*)$
这个Expressen的开头就像“/ soccer / poland /”,而不是“带有a到z(小)或 - ”的所有内容以及字符串的其余部分。
而不是第二组!
小组应该持有这个字符串:
然后简单地用“”替换“ - ”并在TRIM Spaces之后替换。
PS:如果你使用regex101.com,例如,你需要转义/ AND只使用一行字符串! 表达
^(\/soccer\/poland\/)([a-z\-]*)(.*)$
你的一行你的字符串。
<强> /足球/波兰/橙波兰足球甲级联赛-青年2010-2011 /结果/ 强>
如果你喜欢使用表达式而不只是用于足球和波兰,请使用
^(\/[a-z]*\/[a-z]*\/)([a-z\-]*)(.*)$