Python中的多个正则表达式匹配(或逻辑?)

时间:2017-09-03 15:25:01

标签: python regex

我有一个数据列表,格式如下:

 /packagename-<digits> <someline>

我也需要解析packagename。主要问题是它也可以是:

Package_Name

Package-Name

package-name

甚至

package_name

我尝试了以下模式:

(?<=\/)\w+

好吧,它按预期匹配packagename,但我应该如何解析其余的?似乎我没有应用或逻辑或做错了。

3 个答案:

答案 0 :(得分:0)

使用群组时很简单:

import re

data = "/packagename-123 <someline>"
mo = re.search(r"(\w+)-(\d+)\s+(.*)$",
               data, flags=re.DOTALL)
print(mo.groups())
# -> ('packagename', '123', '<someline>')

小组是:

  • \w+匹配包名称,直到连字符
  • \d+匹配数字直到空格
  • .*以匹配剩余的直到结束。

答案 1 :(得分:0)

我认为你可以使用这样的正则表达式:

/\/package[-_]?name\D*(\d+)\s+(.+)$/i

[Regex Demo]

\/package    => matches '/package'
[-_]?        => matches '-' or '_' or ''
name         => matches 'name'
\D*          => matches spaces,dashes or '' that comes before numbers
(\d+)        => matches <digits>
\s+          => at lease one space will follow
(.+)         => matches <some lines>
$            => to the end
/i           => insensitive flag for case insensitive

答案 2 :(得分:0)

仔细考虑案例。

看来&#34;包名&#34;是一个领先的&#39; /&#39;在终止-<numbers><space>'之前。 &#34;空间&#34;是关键,因为你不会在包名中找到空格(对吧?)。

所以,看看非贪婪的比赛:

re.match(r'/(.*?)-[0-9]+ (.*)', data)

.*?是一种非贪婪的形式,所以它会匹配&#34;所有&#34;,但只能让剩下的RE匹配。 -[0-9]+位,允许您查看&#34;&#34;包的结尾。

分组()允许您检索结果:包名称(没有数字,(正如我写的那样)和其余部分。