我有各种命令的列表su。所有命令都使用命令的完整路径su。命令可能有也可能没有用户名,可能有也可能没有选项-。在用户名之后也可能有选项和参数,例如/usr/bin/su aa*or /bin/su - squid *或/bin/su - mapr -c "/usr/bin/hadoop fs -mkdir /user/*"。这是我尝试过的方法,但在遇到麻烦之前我并没有走得太远。for c in su_commands.all()[0:10]: ...: print(c.name) ...: m = re.search('/su\s*[-]\s*(\S*)', c.name).group(1) ...: print(m) ...: //bin/su - audituser.genaudituser.gen//usr/bin/su - hradmhradm/apps/su - capitalcapital/apps/su - cscdmcscdm/apps/su - invadminvadm/bib/su sapbridgTraceback (most recent call last): File "/apps/sfo_rcecala/sfo_rcecala/env3/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-39-788d11c0e2c2>", line 3, in <module> m = re.search('/su\s*[-]\s*(\S*)', c.name).group(1)AttributeError: 'NoneType' object has no attribute 'group'我认为我的正则表达式中的 have[-]会使-可选的。谢谢巴尔马尔。我已经更新了我的正则表达式,现在我更进一步了。for c in su_commands.all()[0:10]: ...: print(c.name) ...: m = re.search('/su\s*\-?\s*(\S*)', c.name).group(1) ...: print(m) ...: //bin/su - audituser.genaudituser.gen//usr/bin/su - hradmhradm/apps/su - capitalcapital/apps/su - cscdmcscdm/apps/su - invadminvadm/bib/su sapbridgsapbridg/bin//su - hdpapjpahdpapjpa/bin/su oabifstg/bin/su xxcconxxxcconx/bin/su xxswaadmxxswaadm但如您所见,我错过了用户oabifstg。
1 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
使某些东西可选的语法是放在?
它后面。方括号用于指定字符集,例如[abc]
匹配a
, b
, 或c
。
尝试这个。
m = re.search(r'/su\s+(?:-\s+)?(\S*)', c.name).group(1)
之后至少需要一个空格su
,后面-
跟空格的是可选组。
如果要在用户名之前允许任意选项,请使用匹配-
后跟零个或多个非空格字符的重复组。
m = re.search(r'/su\s+(?:-\S*\s+)*(\S*)', c.name).group(1)
我还使用了原始字符串,以便模块处理所有转义序列re
。有关更多详细信息,请参阅此内容。
添加回答
举报
0/150
提交
取消