背景
LaTeX英文论文中,标点符号后需要存在空格,即开启下一句需要先输入一个空格。
在编写论文时有时会忘记敲空格,我们需要找出这些不符合规范的句子。
举个例子就明白了:
句子A
It is a dog,it is a cat.It is a bird.
这么写是不规范的,正确的应该是
句子B
It is a dog, it is a cat. It is a bird.
应该能看出差异,我们的目标是找出句子A这样的句子。
解决办法
手动查找是很累的的,这里采用正则表达式寻找:
1 | (?<!\{.*|\&.*|\[.*)\w[,.:\)]\w |
解读正则表达式
从后向前说:
\w
:下一句的英文字符(一般来说英文句子都是以英文开头,这里没有考虑数字开头)[,.:\)]
:代表标点符号,这里可以根据具体需求自由书写。(?<!\{.*|\&.*|\[.*)
:- 这是一个整体符号,大框架是
(?<!pattern)
,是一种断言结构,含义是排除左侧字符是pattern的字符串。 (?<!\{.*|\&.*|\[.*)
的含义是排除左侧是{
或者左侧是[
或者左侧是&
的字符,用于排除图表等结构中的字符,可以根据具体需求,向(?<!pattern)
结构中添加字符,以|
间隔。
- 这是一个整体符号,大框架是
这样,我们就可以筛选类似句子A这种不规范的书写方式。
当然,这个正则表达式还有考虑不周之处,但基本可以解决我们的需求。
附录
类似(?<!pattern)
的正则表达式还有(?<=pattern)
、(?=pattern)
、(?!pattern)
、(?:pattern)
,其含义如下表所示(来自百度百科:正则表达式)
元字符 | 描述 | |||
---|---|---|---|---|
(?:pattern) | 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(\ | )”来组合一个模式的各个部分时很有用。例如“industr(?:y\ | ies)”就是一个比“industry\ | industries”更简略的表达式。 |
(?=pattern) | 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95\ | 98\ | NT\ | 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95\ | 98\ | NT\ | 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。 |
(?<=pattern) | 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95\ | 98\ | NT\ | 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等 |
(?<!pattern) | 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95\ | 98\ | NT\ | 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等 |