因此,我试图在文件的每一行中找到一个或多个字符串,并计算每个字符串在文件中出现的总次数。在某些行中只有一个字符串,但在其他行中可能有多个目标字符串,如果这有意义的话。我试图使用正则表达式来做到这一点。
因此,我尝试了如下方法(已经读取了文件并使用.readlines将其分隔为行):
1count=0
2count=0
3count=0
Pattern=r'(?i)(\bString1\b)|(\bString2\b)|(\bString3\b)'
i=0
while i!=len(lines)
match=re.search(pattern, lines[i])
if match:
if match.group(1):
1count=1count+1
elif match.group(2):
2count=2count+1
elif match.group(3):
3count=3count+1
i=i+1
当行中没有多个匹配项时,这是有效的,但是当行中有多个匹配项时,它显然只计算第一个匹配项,然后继续。有没有办法让我扫描整行?我知道re.findall会找到所有匹配项,但它会将它们放入一个数组中,我不知道如何可靠地计算每个单词的匹配项数量,因为findall中的匹配在每次循环通过的数组中具有不同的索引。
3条答案
按热度按时间njthzxwz1#
在您的示例中,匹配项都是静态字符串,因此您可以将它们用作Counter对象的字典键。
这里有用的部分更改是使用
re.finditer()
而不是re.findall
,它返回一个正确的re.Match
对象,如果您愿意,您可以从中提取具有.group(0)
以及各种其他属性的匹配字符串。如果需要提取可能包含变体的匹配,如
r"c[ei]*ling"
或r"\d+"
,则不能将匹配的字符串用作字典键(因为Counter
会将每个唯一字符串作为单独的实体;所以你会得到“12次出现123”和“1次出现234”而不是“13次出现\d+
”);在这种情况下,我可能会尝试使用命名子组。lc8prwob2#
您可以使用
findall
并在末尾计算出现次数。例如:注意:
findall
将返回一个元组列表,其中元组的第一项对应第一组,依此类推。all_matches
将是元组的列表,每个元组的形状是(matched item for string1, matched item for string2, matched item for string3)
,如果没有匹配的,它将是''
,类似于这样:例如,在计算
count1
时,我们创建了一个匹配String1的元素列表(我们看到的条件是,元组的第一个元素等于'String1'),如下所示:然后我们返回其长度作为这些元素的count1length的值:
ovfsdjhp3#
另一个变体是使用
numpy
及其count_nonzero
方法。由于不需要将数据分隔成行,让我们假设所有数据都在data
中: