Наиболее распространенный "начинается с" в файле, чтобы вывести комментарий комментария - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь определить, какой символ комментария может использовать файл.Например:

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

Есть ли способ получить наибольшее количество комментариев «начинается с» пути в списке и пересечь его с помощью набора возможных символов комментария?Сейчас я делаю следующее, но это выглядит довольно наивно:

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)
>>> #

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать 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})
0 голосов
/ 18 декабря 2018

Я бы сопоставил начало строк с комбинацией ваших строк комментариев, затем подсчитал вхождения.

И, наконец, вычислил строку с максимальным количеством вхождений

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 строк, это может быть довольно медленно.Здесь все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...