如何制定Python正则表达式以获取btrfs subvol ID

时间:2015-10-05 15:52:11

标签: python regex

我正在解析/etc/mtab并希望捕获第二个字段以及第四个字段中的subvolsubvolid设置。但是,我在制定正确的正则表达式时遇到了一些麻烦。请参阅:

import re
def test(regex):
    def helper(string):
        m = re.match(regex, string)
        if m is None: print("no matches")
        else: print(m.groups())
    helper("/dev/sdb2 /mnt/btrfs btrfs rw,noatime 0 0")
    helper("/dev/sdb2 /tmp btrfs rw,noatime,subvol=os-aux/kubuntu-lts/tmp 0 0")
    helper("/dev/sdb2 /tmp btrfs noatime,subvol=os-aux/kubuntu-lts/tmp,rw 0 0")
    helper("/dev/sdb2 /tmp btrfs subvol=os-aux/kubuntu-lts/tmp,rw,noatime 0 0")

预期的产出当然是:

('/mnt/btrfs', None)
('/tmp', 'subvol=os-aux/kubuntu-lts/tmp')
('/tmp', 'subvol=os-aux/kubuntu-lts/tmp')
('/tmp', 'subvol=os-aux/kubuntu-lts/tmp')

现在我的实验和他们的结果显示出来了:

>>> test("\S+ (\S+) \S+ \S+(subvol(?:id)?=[^ ,]+)?")
('/mnt/btrfs', None)
('/tmp', None)
('/tmp', None)
('/tmp', None)
>>> test("\S+ (\S+) \S+ \S+?(subvol(?:id)?=[^ ,]+)?")
('/mnt/btrfs', None)
('/tmp', None)
('/tmp', None)
('/tmp', None)
>>> test("\S+ (\S+) \S+ \S+(subvol(?:id)?=[^ ,]+)")
no matches
('/tmp', 'subvol=os-aux/kubuntu-lts/tmp')
('/tmp', 'subvol=os-aux/kubuntu-lts/tmp')
no matches

我做错了什么?如何制定一个正则表达式来实现我的目标?

感谢。

1 个答案:

答案 0 :(得分:2)

这个对我有用

\S+ (\S+) \S+ \S*(subvol(?:id)?=[^ ,]*)

另外,这是一个非常有用的正则表达式网站 https://www.debuggex.com/

编辑:

这个也匹配没有subvol的那些:

\S+ (\S+) \S+ (?:\S*(subvol(?:id)?=[^ ,]*)|\S*)