所以我试图在python中使用正则表达式从BibTex中获取字符串。这是我的字符串的一部分:
a = '''title = {The Origin ({S},
{Se}, and {Te})- {TiO$_2$} Photocatalysts},
year = {2010},
volume = {114},'''
我想获取标题的字符串,即:
The Origin ({S},
{Se}, and {Te})- {TiO$_2$} Photocatalysts
我目前有这段代码:
pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I)
pattern.findall(a)
但它只给了我:
['The Origin ({S},\n {Se}, and {Te})- {TiO$_2$} Photocatalysts},\n year = {2010']
如何在没有year
信息的情况下获取整个标题字符串?
很多时候,year
之后title
不正确。所以我不能用:
pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n.*year', re.DOTALL|re.I)
pattern.findall(a)
答案 0 :(得分:1)
快速解决方案是修改正则表达式
pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I)
答案 1 :(得分:1)
取决于你想要你的正则表达式的一般程度。我想你希望你的字符串能够包含{和},所以使用它来标记模式的结尾将导致问题。也可能有多个括号。
这是一个想法,如果你在正则表达式的末尾查找单词year会怎么样,假设它是常数。
bar2/doc
答案 2 :(得分:1)
使用较新的regex module
:
import regex as re
rx = re.compile(r'''
(?(DEFINE)
(?<part>\w+\ =\ \{)
(?<end>\},)
(?<title>title\ =\ \{)
)
(?&title)(?P<t>(?:(?!(?&part))[\s\S])+)(?&end)
''', re.VERBOSE)
string = '''
title = {The Origin ({S},
{Se}, and {Te})- {TiO$_2$} Photocatalysts},
year = {2010},
volume = {114},
'''
title = rx.search(string).group('t')
print(title)
# The Origin ({S},
# {Se}, and {Te})- {TiO$_2$} Photocatalysts
虽然不是真的需要,但它提供了另一种解决方案。
答案 3 :(得分:0)
textwrap非常有用:
<title>The Title</title>