Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式,如何匹配一个字符串n次出现_Python_Regex - Fatal编程技术网

Python正则表达式,如何匹配一个字符串n次出现

Python正则表达式,如何匹配一个字符串n次出现,python,regex,Python,Regex,我想匹配包含单词100.00%的行,共出现3次 e、 g 所以第1行和第3行都应该匹配 然而,我下面的正则表达式似乎只与100.00%重复3次的情况相匹配。(仅匹配线3) 我想知道我应该怎么做,以配合线1以及 谢谢大家 Halemur Ali的答案比我留下的这个答案要清晰得多,这只是为了完整 符号{3}仅仅是一种快捷方式,您可以通过扩展重复序列来替换它。要匹配序列100.00%正好出现3次的行,可以使用: "^(?:(?!100\.00%).)*(?:100\.00%(?:(?!100\.00%

我想匹配包含单词100.00%的行,共出现3次

e、 g

所以第1行和第3行都应该匹配

然而,我下面的正则表达式似乎只与100.00%重复3次的情况相匹配。(仅匹配线3)

我想知道我应该怎么做,以配合线1以及


谢谢大家

Halemur Ali的答案比我留下的这个答案要清晰得多,这只是为了完整

符号
{3}
仅仅是一种快捷方式,您可以通过扩展重复序列来替换它。要匹配序列
100.00%
正好出现3次的行,可以使用:

"^(?:(?!100\.00%).)*(?:100\.00%(?:(?!100\.00%).)*){3}$"
这使用了

可以这样理解:

  • ^
    行的开头
  • (?:(?!100\.00%)*
    任何字符(零或更多),直到
    100.00%
    序列
  • (?:100\.00%
    序列
  • (?!100\.00%)*
    后跟任何字符(零或更多),直到
    100.00%
    序列
  • {3}
    重复3次
  • $
    行尾
考虑一下python的模块文档


注:匹配单个字符不需要括号。

另一种需要更简单正则表达式的方法是查找所有匹配
100.00%
的子字符串,并测试计数是否=3

范例

import re

p = re.compile(r'100\.00%')
texts = ['some string 100.00% foo 100.00% 100.00%',
         'some string  99.91%  foo 100.00% 99.91%',
         'some string 100.00%100.00%100.00%']

matches = [i for i, t in enumerate(texts)
           if len(re.findall(p, t)) == 3]
# matches = [0, 2]

r'(100\.00%.*{3}'
也应该做到这一点,而且可读性、简洁性和(我认为)性能都很好

它只符合底线,因为它们都是触动的。但是第1行中间有一些东西,比如空格和
foo
。你现在的正则表达式不能解释这一点。这个怎么样?重新搜索('100\.00%.'100\.00%.'100\.00%.'100\.00%,字符串)@shipping这将匹配重复次数超过3次的字符串times@silel是的,它将匹配3条或更多100.00%的线。该帖子不清楚是否必须精确到100.00%的3次出现。@Shiping,很抱歉没有澄清我的问题。我想精确匹配3个发生率可能是
r'(100\.00%.*.{3}'
@HaleemurAli是的,谢谢,在基数中编辑并忘记转义。这也会匹配超过3个
100.00%
序列的行。就像@siel所说的。它将匹配3次以上的事件,我想精确匹配3次非常感谢您的回答!你们和Halemur Ali的回答都解决了我的问题,非常感谢你们的详细解释!
"^(?:(?!100\.00%).)*(?:100\.00%(?:(?!100\.00%).)*){3}$"
import re

p = re.compile(r'100\.00%')
texts = ['some string 100.00% foo 100.00% 100.00%',
         'some string  99.91%  foo 100.00% 99.91%',
         'some string 100.00%100.00%100.00%']

matches = [i for i, t in enumerate(texts)
           if len(re.findall(p, t)) == 3]
# matches = [0, 2]