簡體   English   中英

使用Python正則表達式從.tex文檔中提取文本

[英]Extracting text from a .tex document with Python regular expressions

我正在嘗試從LaTeX文件中檢索一堆文本,該文本由諸如

\newcommand{\lhaac}{% 2
Olkoot tapahtumat A = 'kortti on musta', B = 'kortti on hertta' ja 
C = 'kortti on kuvakortti tai ässä'. Lausu seuraavat tapahtumat joukkojen A,B ja C sekä joukko-operaatioiden avulla\\% ja laske todennäköisyydet  \\
        \textbf{a)}     Kortti on musta kuvakortti tai musta ässä\\
        \textbf{b)} Kortti on ruutu\\
        \textbf{c)} Kortti ei ole ruutu, mutta se on kuva tai ässä\\
        \textbf{d)} Kortti on joko punainen tai se on arvoltaan 2-10, mutta ei molempia

}
%__________
\newcommand{\lhaacv}{%
a) Kortti on musta kuvakortti tai musta ässä = Kortti on musta ja kortti on kuvakortti tai  ässä: $A\cap C$,\\  
b) Kortti on ruutu = kortti ei musta ja ei hertta: $\overline{A}\cap\overline{B} = \overline{A\cup B}$\\
c) (Kortti on musta tai hertta) ja kortti on  kuva tai ässä:\\ $(A\cup B)\cap C = (A\cap C)\cup (B\cap C)$ \\ 
d) Kortti on punainen kuvakortti tai musta pikkukortti:\\ $(\overline{A}\cap C)\cup (A\cap \overline{C}) = (\overline{A}\cup \overline{C})\backslash (\overline{A}\cap \overline{C})$

}

使用re.findall ,我想在每個命令中緊跟\\lh之后訪問3個字母的代碼以及命令的內容或定義,這意味着在命令名定義之后的大括號之間包含整個文本塊。

解析3個字母的代碼不是問題,但\\newcommand{\\lhaac}{<contents>}證明很難獲得\\newcommand{\\lhaac}{<contents>}所有內容的訪問權限,因為LaTeX源代碼可能包含花括號和反斜杠以及其他討厭的東西,這使得很難表達我要訪問的內容實際上是如何結束的(因為大括號會結束命令定義)。 注釋行

%__________

每個命令后都不能相信它存在。

我已經嘗試過這個這個 ,對於初學者來說。 在第一種情況下,匹配在遇到第一個}之后停止,而在第二個示例中,開始{之后的幾乎所有東西都被匹配,正如預期的那樣。 嘗試更復雜的東西像似乎是一個簡單的測試情況下工作,但輸入文件中找到的實際塊產生不匹配。

因此,我在尋求幫助以解開這個難題。 我似乎看不到我在這里缺少什么。 在最后一種情況下,我認為我已經介紹了普通文本,數學(內聯$<math here>$和顯示$$<math here>$$ )以及命令( \\<command name>[<optional argument>]{<mandatory argument>} ),帶或不帶參數。 環境,例如

\begin{<environment name>}[<optional argument>]{<mandatory argument>}
  <contents>
\end{<environment name>} 

仍然缺少,但是以后可以輕松覆蓋。

根據re.findall文檔 ,它應該返回一個元組列表(因為我在正則表達式中有多個捕獲組),每個元組的第三個元素是三字母代碼,第二個元素是命令內容。 在這種情況下,返回的第一個元組(包含在列表中)將是

[("aac", "% 2
Olkoot tapahtumat A = 'kortti on musta', B = 'kortti on hertta' ja 
C = 'kortti on kuvakortti tai ässä'. Lausu seuraavat tapahtumat joukkojen A,B ja C sekä joukko-operaatioiden avulla\\% ja laske todennäköisyydet  \\
        \textbf{a)}     Kortti on musta kuvakortti tai musta ässä\\
        \textbf{b)} Kortti on ruutu\\
        \textbf{c)} Kortti ei ole ruutu, mutta se on kuva tai ässä\\
        \textbf{d)} Kortti on joko punainen tai se on arvoltaan 2-10, mutta ei molempia

")]

干得好:

= ^ .. ^ =

import re

raw_string = """\newcommand{\lhaac}{% 2
Olkoot tapahtumat A = 'kortti on musta', B = 'kortti on hertta' ja 
C = 'kortti on kuvakortti tai ässä'. Lausu seuraavat tapahtumat joukkojen A,B ja C sekä joukko-operaatioiden avulla\\% ja laske todennäköisyydet  \\
        \textbf{a)}     Kortti on musta kuvakortti tai musta ässä\\
        \textbf{b)} Kortti on ruutu\\
        \textbf{c)} Kortti ei ole ruutu, mutta se on kuva tai ässä\\
        \textbf{d)} Kortti on joko punainen tai se on arvoltaan 2-10, mutta ei molempia

}
%__________
\newcommand{\lhaacv}{%
a) Kortti on musta kuvakortti tai musta ässä = Kortti on musta ja kortti on kuvakortti tai  ässä: $A\cap C$,\\  
b) Kortti on ruutu = kortti ei musta ja ei hertta: $\overline{A}\cap\overline{B} = \overline{A\cup B}$\\
c) (Kortti on musta tai hertta) ja kortti on  kuva tai ässä:\\ $(A\cup B)\cap C = (A\cap C)\cup (B\cap C)$ \\ 
d) Kortti on punainen kuvakortti tai musta pikkukortti:\\ $(\overline{A}\cap C)\cup (A\cap \overline{C}) = (\overline{A}\cup \overline{C})\backslash (\overline{A}\cap \overline{C})$

}
%__________
"""

remove_command = re.sub(r'\newcommand{\\', '', raw_string)
codes = re.findall('lh\w+', remove_command)

part_1 = []
for item in codes:
    part_1.append(item[2::])


result2 = re.findall(r'{.*?}\n%_+', remove_command, re.DOTALL)
part_2 = []
for item in result2:
    clean_1 = re.sub(r'{%', '', item)
    clean_2 = re.sub(r'\n}\n%_+', '', clean_1)
    part_2.append(clean_2)


result = zip(part_1, part_2)

輸出:

aac
 2
Olkoot tapahtumat A = 'kortti on musta', B = 'kortti on hertta' ja 
C = 'kortti on kuvakortti tai ässä'. Lausu seuraavat tapahtumat joukkojen A,B ja C sekä joukko-operaatioiden avulla\% ja laske todennäköisyydet  \
            extbf{a)}     Kortti on musta kuvakortti tai musta ässä\
            extbf{b)} Kortti on ruutu\
            extbf{c)} Kortti ei ole ruutu, mutta se on kuva tai ässä\
            extbf{d)} Kortti on joko punainen tai se on arvoltaan 2-10, mutta ei molempia

------------------------------------------------------------------------------------------------------------------------------------------------------
aacv

a) Kortti on musta kuvakortti tai musta ässä = Kortti on musta ja kortti on kuvakortti tai  ässä: $A\cap C$,\  
b) Kortti on ruutu = kortti ei musta ja ei hertta: $\overline{A}\cap\overline{B} = \overline{A\cup B}$\
c) (Kortti on musta tai hertta) ja kortti on  kuva tai ässä:\ $(A\cup B)\cap C = (A\cap C)\cup (B\cap C)$ \ 
d) Kortti on punainen kuvakortti tai musta pikkukortti:\ $(\overline{A}\cap C)\cup (A\cap \overline{C}) = (\overline{A}\cup \overline{C}ackslash (\overline{A}\cap \overline{C})$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM