正则表达式:特殊字符和制表符空格

时间:2013-06-30 04:33:09

标签: python regex

我正在测试我写的一个函数。它应该给我一个行或字符串中的句号(。)的计数。我感兴趣的完全停止(。)在它之前和之后都有一个标签空间。

这是我写的。

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

然而,当我测试它时,它返回0.从a开始,有2个句号(。),前后都有一个制表符空格。我不正确地使用正则表达式吗?代表不正确?任何帮助表示赞赏。

感谢。

2 个答案:

答案 0 :(得分: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()

这使用“lookahead”和“lookbehind”匹配tab字符而不消耗它。那是什么意思?这意味着当您拥有\t.\t.\t时,您实际上会匹配第一个和第二个\.。原始表达式将匹配初始\t\.\t 并将其丢弃。之后,会有一个\.,前面没有任何东西,因此没有第二个匹配。外观语法是“零宽度” - 表达式已经过测试但最终在最终匹配中没有占用空间。因此,我刚刚给出的代码片段返回2,正如您所期望的那样。

答案 1 :(得分:0)

如果用一个Tab键替换“\ t”,它将起作用。

请注意,count只计算子字符串的非重叠出现次数,因此除非您使用正则表达式,否则它将无法按预期工作,或者将子字符串更改为仅测试期间前面的制表符。