【问题标题】:Most common "startswith" in a file to infer comment char文件中最常见的“startswith”来推断注释字符
【发布时间】:2019-05-19 07:42:28
【问题描述】:

我正在尝试确定文件可能使用的注释字符。例如:

site,rank
#alexa.com/rankings
google.com,1
yahoo.com,2

有没有办法在列表中获取最多评论“startswith”路径,并将其与一组可能的评论字符相交?我现在在做的事情如下,但是看起来很幼稚:

POSSIBLE_COMMENT_CHARS = ['#', '//', '/*', '*/']

def get_comment_char(file):
    with open(file) as f:
        for line in f:
            for _char in POSSIBLE_COMMENT_CHARS:
                if line.startswith(_char):
                    return _char

使用上面的文件数据,它会返回:

get_comment_char(myalexafile)
>>> #

【问题讨论】:

  • 那些日子你很喜欢猜测 :)
  • @Jean-FrançoisFabre ha,我无法控制很多用户输入!
  • 至少那一个是可以回答的

标签: python python-3.x collections


【解决方案1】:

我会将行首与您的注释字符串的组合相匹配,然后计算出现次数。

最后计算出现次数最多的字符串

text="""
site,rank
#alexa.com/rankings
google.com,1
#yahoo.com,2
//whatever
# another comment

"""

import collections,re

POSSIBLE_COMMENT_CHARS = ['#', '//', '/*', '*/']

c = collections.Counter(re.findall("^({})".format("|".join(re.escape(x) for x in POSSIBLE_COMMENT_CHARS)),
     text,flags=re.MULTILINE))

print(max(c,key=lambda k: c.get(k)))

打印#

在一般情况下要小心"|".join(re.escape(x) for x in POSSIBLE_COMMENT_CHARS,因为它意味着线性搜索。如果您的列表中有5000 字符串,它可能会很慢。没关系。

【讨论】:

  • 谢谢。不过,这也给了我很多//,我稍后会在 urls 行中(中行,而不是行首)。这是一个示例输出:Counter({'//': 966, '#': 34})
  • 啊对了,忘了用 () 保护我的表达式,所以^ 只适用于第一个!!固定。
【解决方案2】:

您可以使用Counter 和正则表达式:

from collections import Counter
import re 

with open(fn) as f: 
    c=Counter(m.group(1) for line in f for m in re.finditer(r'^\s*(#|//|/\*|\*/)', line))

>>> c
Counter({'#': 1})

【讨论】:

  • 看起来很简单,但比接受的答案慢3倍以上
  • @hda:这是一个愚蠢的评论,没有展示你的工作时间。正则表达式 r'^\s*(#|//|/\*|\*/)'"|".join(re.escape(x) for x in POSSIBLE_COMMENT_CHARS) 本质上是相同的正则表达式。
  • 我不认为正则表达式是问题,但在这种情况下它确实很慢而且速度很重要
猜你喜欢
  • 2017-02-06
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2022-11-08
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多