0

我正在测试我编写的一个函数。它应该给我一行或字符串中句号(。)的计数。我有兴趣计算的句号 (.) 在它之前和之后都有一个制表符空间。

这是我写的。

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

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

谢谢。

4

2 回答 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()

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

于 2013-06-30T04:36:25.833 回答
0

如果您将 '\t' 替换为单个 Tab 键,它将起作用。

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

于 2013-06-30T04:59:14.497 回答