我正在解析/etc/mtab
并希望捕获第二个字段以及第四个字段中的subvol
或subvolid
设置。但是,我在制定正确的正则表达式时遇到了一些麻烦。请参阅:
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
我做错了什么?如何制定一个正则表达式来实现我的目标?
感谢。
答案 0 :(得分:2)
这个对我有用
\S+ (\S+) \S+ \S*(subvol(?:id)?=[^ ,]*)
另外,这是一个非常有用的正则表达式网站 https://www.debuggex.com/
编辑:
这个也匹配没有subvol的那些:
\S+ (\S+) \S+ (?:\S*(subvol(?:id)?=[^ ,]*)|\S*)