我有一個文本檔案,我試圖從中提取標題到 excel 列。但是,所需的標題在特定模式內:
COM *******************
COM * Title 1*
COM *******************
COM ***************************
COM * Sub 1 *
COM ***************************
{
...TEXT DETAILS...
}
COM ***************************
COM * Sub 2 *
COM ***************************
{
...TEXT DETAILS...
}
COM *******************
COM * Title 2*
COM *******************
COM ***************************
COM * T2 Sub 1 *
COM ***************************
{
...TEXT DETAILS...
}
COM ***************************
COM * T2 Sub 2 *
COM ***************************
{
...TEXT DETAILS...
}
字串提取(標題)格式所需的輸出為:
['Title 1', 'Sub 1',..,'T2 Sub 2']
或 excel 列作為
CATEGORY
Title 1
Sub 1
Sub 2
Title 2
T2 Sub 1
T2 Sub 2
它實際上是“COM *****”模式和由我無法實作的標題組成的中間行。我最近根據字串模式提取了所需的字串,我認為這與我當前的問題相似。
對于這種情況,i/p 文本檔案采用以下格式:
CTG 'GEN:LT'
{
TEXT DETAILS....
}
CTG 'GEN:FR'
{
TEXT DETAILS....
}
CTG 'GEN:G_L02'
{
TEXT DETAILS....
}
CTG 'GEN:ER'
{
TEXT DETAILS....
}
CTG 'GEN:C1'
{
TEXT DETAILS....
}
我的目標是在CTG之后提取字串,它位于' ' 我的想法是檢測CTG字串并在其旁邊列印字串。這是我實作相同的方法:
import re
def getCtgName(text):
matches = re.findall(r"'(. ?)'",text)
return matches
mylines = [] # Declare an empty list.
with open ('filepath.txt', 'rt') as myfile: # Open .txt for reading text.
for myline in myfile: # For each line in the file,
mylines.append(myline.rstrip('\n')) # strip newline and add to list.
columns = []
substr = "CTG" # substring to search for.
for line in mylines: # string to be searched
if substr in line:
columns.append(getCtgName(line)[0])
print(columns)
并得到輸出:
['GEN:LT', 'GEN:FR',..., 'GEN:C1']
我相信可以為這些注釋(COM****)行之間的標題提取實作類似的邏輯,對代碼或邏輯或資源的任何幫助將不勝感激。謝謝!
uj5u.com熱心網友回復:
我認為您可以使用lookbehind 和lookahead 將此代碼簡化為一個正則運算式模式。這兩種技術允許您指定必須在匹配之前或之后出現但不包含在匹配本身中的特定部分。語法(?<=text)用于后視和(?=text)前瞻。
因此,標題之前COM ***************************\nCOM *的部分是,后面的部分是*\nCOM ***************************。當我們把它放在正則運算式語法中時,模式是:
(?<=COM \*{27}\nCOM \*)[^\n] (?=\*\nCOM \*{27})
在 python 代碼中,它變成:
import re
with open ('filepath.txt', 'rt') as myfile:
txt=myfile.read()
pattern=r"(?<=COM \*{27}\nCOM \*)[^\n] (?=\*\nCOM \*{27})"
titles=re.findall(pattern,txt)
另一種方法是先使用您的代碼,然后洗掉結果中所有出現的“***************************”。
一個實作:
import re
def getCtgName(text):
matches = re.findall(r"'(. ?)'",text)
return matches
mylines = [] # Declare an empty list.
with open ('filepath.txt', 'rt') as myfile: # Open .txt for reading text.
for myline in myfile: # For each line in the file,
mylines.append(myline.rstrip('\n')) # strip newline and add to list.
titles = []
substr = "CTG" # substring to search for.
for line in mylines: # string to be searched
if substr in line:
titles.append(getCtgName(line)[0])
while "*"*27 in titles:
titles.remove("*"*27)
print(titles)
uj5u.com熱心網友回復:
假設標題和主題沒有 * 作為值,只需在函式 getCtgName 中使用以下正則運算式而不是您的正則運算式:
matches = re.findall(r"COM\s*\*([^*] )", text)
uj5u.com熱心網友回復:
我假設標題不包含*字符。
import re
headings = []
# Assuming that each line from the text file is already read and stored in a list named 'strings'
for string in strings:
sub_string = re.search('COM \*([^*] )\*', string)
if sub_string:
headings.append(sub_string.group(1).strip())
輸入:
strings = [
'COM *******************',
'COM * Title 1*',
'COM *******************',
'COM ***************************',
'COM * Sub 1 *',
'COM ***************************',
'{',
'...TEXT DETAILS...',
'}',
'COM ***************************',
'COM * Sub 2 *',
'COM ***************************',
'{',
'...TEXT DETAILS...',
'}',
'COM *******************',
'COM * Title 2*',
'COM *******************',
'COM ***************************',
'COM * T2 Sub 1 *',
'COM ***************************',
'{',
'...TEXT DETAILS...',
'}',
'COM ***************************',
'COM * T2 Sub 2 *',
'COM ***************************',
'{',
'...TEXT DETAILS...',
'}',
]
輸出:
['Title 1', 'Sub 1', 'Sub 2', 'Title 2', 'T2 Sub 1', 'T2 Sub 2']
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485419.html
上一篇:ExcelIFORAND嵌套公式
下一篇:excel里面有for回圈嗎?
