我有一个数据列表,格式如下:
/packagename-<digits> <someline>
我也需要解析packagename
。主要问题是它也可以是:
Package_Name
或
Package-Name
或
package-name
甚至
package_name
我尝试了以下模式:
(?<=\/)\w+
好吧,它按预期匹配packagename
,但我应该如何解析其余的?似乎我没有应用或逻辑或做错了。
答案 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
\/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;包的结尾。
分组()
允许您检索结果:包名称(没有数字,(正如我写的那样)和其余部分。