2013-06-30 258 views
0

我测试了,我写了一个函数。它应该给我一个行或字符串的句号(。)的数量。我感兴趣计算的句号(。)在它之前和之后都有一个标签空间。正则表达式:特殊字符和制表符空格

这里是我写。

def Seek(): 
    a = '1 . . 3 .' 
    b = a.count(r'\t\.\t') 
    return b 
Seek() 

然而,当我测试,它返回0。从一个,有2个句号(。)与之前和之后它分页空间。我是否正常使用正则表达式?代表错误?任何帮助表示赞赏。

谢谢。

回答

3

它看起来并不像a中有任何选项卡。虽然您可能击中了键盘上的tab键,但该文字编辑器将该文字解释为“插入多个空格以与下一个制表符对齐”。你需要你的线看起来像这样:

a = '1\t.\t.\t3\t.' 

这应该这样做。

更完整的示例:

from re import * 
def Seek(): 
    a = '1\t.\t.\t3\t\.' 
    re = compile(r'(?<=\t)\.(?=\t)'); 
    return len(re.findall(a)) 
print Seek() 

这将使用“先行”和“反向预搜索”不消耗它的字符tab相匹配。那是什么意思?这意味着,当您有\t.\t.\t时,您将实际匹配第一个和第二个\.。原表达将具有匹配的初始\t\.\t并丢弃它们。之后,会有一个\.,它前面没有任何东西,因此没有第二个匹配。 lookaround语法是“零宽度” - 表达式已经过测试,但最终匹配中没有空格。因此,我刚刚给出的代码片段返回2,就像您期望的那样。

+0

谢谢!但是,如果我想要完全停止(。)的总数以便值3返回?我将如何包含没有选项卡的最后一个完整选项卡,而没有计算或复制其他选项同时具有两个选项卡? – Hipale

+0

但你也说:“有一个标签之前和之后” ......如果你不后需要的标签,你只是离开了正则表达式的回顾后部分:所以'重新编译=(R'(<=? \ t)\。');'应该这样做 - 未经测试,在iPhone上。 – Floris

+0

没关系。我想我已经用'split'来解决它了。 – Hipale

0

,如果你有一个标签按键取代“\ t”这会工作。

请注意,count只计算子串的非重叠事件,因此它不会像预期的那样工作,除非您使用regex,或者将您的子串更改为仅测试期间前的选项卡。

+0

按Tab键并不总是插入制表符 - 这完全取决于您使用的编辑器。 – Floris