我有各種命令的列表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
提交
取消