我正在测试我编写的一个函数。它应该给我一行或字符串中句号(。)的计数。我有兴趣计算的句号 (.) 在它之前和之后都有一个制表符空间。
这是我写的。
def Seek():
a = '1 . . 3 .'
b = a.count(r'\t\.\t')
return b
Seek()
但是,当我测试它时,它返回 0。从 a 开始,有 2 个句点 (.),前后都有一个制表符空格。我是否不正确地使用正则表达式?表示不正确?任何帮助表示赞赏。
谢谢。
它看起来没有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
因此,正如您所期望的那样,我刚刚给出的代码片段返回了。
如果您将 '\t' 替换为单个 Tab 键,它将起作用。
请注意, count 仅计算子字符串的非重叠出现,因此除非您使用正则表达式,否则它将无法按预期工作,或者将子字符串更改为仅测试句点前面的制表符。