如何改善这个正则表达式?

时间:2015-10-10 09:02:18

标签: regex python-2.7

我有一个像这样的字符串列表:

/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('-', ' ')

有人能看出如何让它变得更好吗?

2 个答案:

答案 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(小)或 - ”的所有内容以及字符串的其余部分。

而不是第二组!

小组应该持有这个字符串:

    1. /足球/波兰/
    1. 橙波兰足球甲级联赛-青年 -
    1. 2010-2011 /结果/

然后简单地用“”替换“ - ”并在TRIM Spaces之后替换。

PS:如果你使用regex101.com,例如,你需要转义/ AND只使用一行字符串! 表达

^(\/soccer\/poland\/)([a-z\-]*)(.*)$

你的一行你的字符串。

<强> /足球/波兰/橙波兰足球甲级联赛-青年2010-2011 /结果/

如果你喜欢使用表达式而不只是用于足球和波兰,请使用

^(\/[a-z]*\/[a-z]*\/)([a-z\-]*)(.*)$