通过Regex修复.bib文件标题

时间:2014-11-29 12:36:47

标签: python regex latex

在.bib文件中准备我的LaTeX参考书目后,我发现大写的问题。

根据:this信息,解决方案是为每个标题中的每个单词添加括号(如我选中的那样,为整个标题添加括号不起作用)。

例如,我希望从更改

title   = "What a interesting title",
title= "What a boring title",
title="What a crazy title",

title   = "{What} {a} {interesting} {title}",
title= "{What} {a} {boring} {title}",
title="{What} {a} {crazy} {title}",

这样:

title <any number of spaces> = <any number of spaces> " <words in title> ",

应替换为:

title <any number of spaces> = <any number of spaces> " <{Each} {word} {in} {title} {should} {be} {in} {bracket}> ",

我试图用Python中的Regex来做,但不知道出了什么问题。

我的代码:

re.sub(r'(title[\s-]*=[\s-]*\")(\b(\w+)\b)',r'\1{\2}',line)

仅在第一个单词中添加括号。

2 个答案:

答案 0 :(得分:1)

这在字符串的第一部分使用负向前瞻:

>>> import re
... s = """title   = "It's an interesting title",
... title= "What a boring title",
... title="What a crazy title","""
... print(re.sub(r'(?!title\s*=\s*")\b(\S+)\b',r'{\1}',s))
title   = "{It's} {an} {interesting} {title}",
title= "{What} {a} {boring} {title}",
title="{What} {a} {crazy} {title}",

请参阅http://regex101.com/r/hL2lE6/6

更新:Avinash Raj对可能出现在标题中的特殊字符(如撇号)提出了一个很好的观点,因此我将\w+更改为\S+并更新了示例文本以对其进行测试。

注意:如果您的标题包含以特殊字符结尾的字词,并且该字符需要包含在括号中,请参阅此处了解解决方案:http://regex101.com/r/hL2lE6/11

它使用(?!title\s*=\s*")\b([^"=\s]+)。但是,您主要担心的是资本化,因此可能无关紧要。在这种情况下,我建议保持简单并坚持使用\S+

答案 1 :(得分:0)

通过re模块无法实现。但您可以通过下面的外部regex模块实现此目的。

>>> import regex
>>> s = '''title   = "What a interesting title",
title= "What a boring title",
title="What a crazy title",'''
>>> print(regex.sub(r'(?m)((?:^title\s*=\s*"|\G) *)([^"\s\n]+)', r'\1{\2}',s))
title   = "{What} {a} {interesting} {title}",
title= "{What} {a} {boring} {title}",
title="{What} {a} {crazy} {title}",

DEMO

\G断言上一场比赛结束时的位置或第一场比赛的字符串开头。 \G强制模式仅返回属于连续匹配链的匹配项。

参考文献: