首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python正则表达式从.tex文档中提取文本

使用Python正则表达式从.tex文档中提取文本
EN

Stack Overflow用户
提问于 2019-08-02 15:47:38
回答 1查看 49关注 0票数 0

我正在尝试从一个LaTeX文件中检索一堆文本,该文件由如下块组成

代码语言:javascript
复制
\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>}的所有内容被证明是困难的,因为LaTeX源代码可能包含大括号和反斜杠以及其他令人讨厌的东西,这使得很难表达我想要访问的内容实际上是如何结束的(因为大括号结束了命令定义)。注释行

代码语言:javascript
复制
%__________

不能相信每个命令后都会存在。

首先,我尝试过thisthis。在第一种情况下,匹配在遇到第一个}之后停止,而在第二个示例中,几乎所有开始{之后的内容都会匹配,正如预期的那样。尝试像this这样更复杂的测试用例似乎可以在简单的测试用例上工作,但entering an actual block found in the file不会产生匹配的结果。

因此,我请求帮助破解这个难题。我好像看不出我错过了什么。在最后一个例子中,我想我已经讨论了普通文本、数学(内联$<math here>$和显示$$<math here>$$)和带参数和不带参数的命令(\<command name>[<optional argument>]{<mandatory argument>})。环境,例如

代码语言:javascript
复制
\begin{<environment name>}[<optional argument>]{<mandatory argument>}
  <contents>
\end{<environment name>} 

仍然缺失,但稍后可以很容易地覆盖这些内容。

根据re.findall documentation,它应该返回一个元组列表(因为我在正则表达式中有多个捕获组),其中3个字母的代码是每个元组的第一个元素,而命令内容是每个元组的第二个元素。在这种情况下,返回的第一个元组(包含在列表中)将是

代码语言:javascript
复制
[("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

")]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-02 17:11:15

这就是了:

=^..^=

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
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})$
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57322016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档