Comment puis-je exclure une chaîne de caractères à partir de python regex
Je suis d'essayer d'analyser /etc/mtab
mais exclure /boot
. J'ai pensé que peut-être non-capture de groupes serait la voie à suivre, mais il ne fonctionne pas comme je l'espérais. C'est la regex, j'ai construit:
proc = subprocess.Popen(["ssh", server, "cat", mtab],stdout = subprocess.PIPE)
for line in proc.stdout:
fsMatch = re.search(r'([\w/:]+) (/([\w/:-]+)|(?:boot)) (nfs|ext3)', line)
if fsMatch:
print fsMatch.group(1,2,4)
De sortie:
('/dev/sda1', '/boot', 'ext3')
('/dev/mapper/foo1', '/export/foo1', 'ext3')
('/dev/mapper/foo2', '/export/foo2', 'ext3')
('/dev/mapper/foo3', '/export/foo3', 'ext3')
('/dev/mapper/foo4', '/export/foo4', 'ext3')
('/dev/mapper/foo5', '/export/foo5', 'ext3')
('servernfs:/install', '/mnt', 'nfs')
Je suis assez confiant sur le |
est faux (et, évidemment, plus c'est mal) mais a frappé un barrage routier.
Je suis à la recherche pour tous les matches /[\w/:-]+
mais exclure correspond à /boot
Suggestions?
- Les expressions régulières ne sont pas bonnes à l'exclusion de choses. Le faire dans une autre case.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un négatif lookbehind ou d'anticipation négatif, décrit ici avec un soupçon ci-dessous:
Si vous avez besoin pour capturer que " servernfs:' et non pas 'servernfs:/boot', vous aurez besoin de les arroser un peu '|' et '([a-z]+:) " quelque part dans le haut (après le '^')
Juste exclure la ligne:
Cependant, depuis
mtab
est délimitée de l'espace, vous pouvez simplement utilisersplit
:if fsMatch
ligne ne serait-il pas? par exemple:if fsMatch and not fsMatch.group(2).startswith('/boot')
?fs:/boot
problème de correspondance.'boot' not in line
filtre, je pense. Et '/boot' ne résout pas le problème, que ce soit sans l'startswith peu. J'aime Jon Clements approche. Nous allons les regex faire le gros du travail d'un match et startswith le simple, précis exclure.