[英]How to find full string from substring with Python?
如何自動提取擴展名為.csv的字符串的一部分。 以下示例顯示了我要從中提取2010_USACE_VA_minmax.csv
的復雜字符串。 在我的情況下,無法使用簡單的切片,而是需要某種模式匹配。
sample = "1001 15707 May 08 23:01 2010_USACE_VA_metadata.xml\r\n-rw-rw-r-- 1 311 1001 1784 May 08 23:01 2010_USACE_VA_minmax.csv\r\ndrwxrwxr-x 2 311 2013"
預期輸出
2010_USACE_VA_minmax.csv
如果您知道這些用空格隔開,並且名稱本身本身不包含任何空格,並且您正在嘗試查找以.csv
結尾的令牌,那么您也可以
>>> tokens = sample.split()
>>> matches = [ i for i in tokens if i.endswith('.csv') ]
>>> matches
['2010_USACE_VA_minmax.csv']
使用正則表達式\\S+\\.csv(?!\\S)
可以實現相同的行為,但可讀性不高:
>>> import re
>>> re.findall(r'\S+\.csv(?!\S)', sample)
['2010_USACE_VA_minmax.csv']
這里\\S+
表示至少1個連續的非空白字符\\.
是字面意思.
字符和(?!\\S)
表示.csv
不能由非空白字符(負零寬度超前斷言)后繼。
但是,看起來您正在解析ls
* nix命令的輸出-另一種方法是使用glob
模塊查找匹配的文件:
>>> from glob import glob
>>> glob('*.csv')
['2010_USACE_VA_minmax.csv']
此正則表達式提取了csv文件。 可能會有一個更強大的正則表達式,我並不完美。 但這有效:
僅供參考:我用它來測試: Pythex
圓括號非常重要,因為它們是您的捕獲組,可以提取您要查找的內容。
(\\s\\w+\\.csv)
如果您想處理文件名中的空格,我相信這應該可以工作:
(\\s[\\w,\\s-]+\\.csv)
這是Python中的正則表達式的侵權: https : //docs.python.org/3/library/re.html
如果路徑中沒有空格:
print(sample[:sample.find(".csv")+4].rsplit(None, 1)[1])
2010_USACE_VA_minmax.csv
輸出看起來也好像來自unix命令,因此使用linux工具來解析它可能是一個主意,如果它是unix命令,則格式很可能是一致的,因此可以拆分行以獲得文件名:
sample = "1001 15707 May 08 23:01 2010_USACE_VA_metadata.xml\r\n-rw-rw-r-- 1 311 1001 1784 May 08 23:01 2010_USACE_VA_minmax.csv\r\ndrwxrwxr-x 2 311 2013"
for line in sample.splitlines():
f = line.rsplit(None, 1)[1]
print(f)
2010_USACE_VA_metadata.xml
2010_USACE_VA_minmax.csv
2013
我認為2013年來自您已將某些輸出截斷了。
如果您使用子進程來運行命令,而您不需要任何其他數據,則ls
可以使用通配符:
from subprocess import check_output
f = check_output(["ls","*.csv"])
或者按照您自己的命令獲取權限等。
data = check_output(["ls","-l","*.csv"])
這將只給您.csv文件及其權限,因此您只需要使用分隔線再次遍歷輸出,最后每個文件都是一個csv文件。
import re
mobj = re.search(r'\s\d{4}_[^ ]*csv',sample)
print(mobj.group())
2010_USACE_VA_minmax.csv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.