我正在测试我写的一个函数。它应该给我一个行或字符串中的句号(。)的计数。我感兴趣的完全停止(。)在它之前和之后都有一个标签空间。
这是我写的。
def Seek():
a = '1 . . 3 .'
b = a.count(r'\t\.\t')
return b
Seek()
然而,当我测试它时,它返回0.从a开始,有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只计算子字符串的非重叠出现次数,因此除非您使用正则表达式,否则它将无法按预期工作,或者将子字符串更改为仅测试期间前面的制表符。