Python CSV Regex Все столбцы и порядковый номер списка выходных столбцов на основе большинства совпадений регулярных выражений - PullRequest
0 голосов
/ 05 августа 2020

Эй, я действительно застрял и очень надеюсь, что кто-нибудь сможет мне с этим помочь. Я пытаюсь прочитать первые 5000 строк файла CSV, разделить строки разделителем табуляции, затем выполнить поиск шаблона регулярного выражения для каждого столбца и строки и вывести номер индекса столбца с наибольшим количеством совпадений / вхождений регулярного выражения. Я приведу пример, который поможет лучше объяснить, что я имею в виду.

test.csv

john smith  1132 Anywhere Lane Hoboken NJ   10.0.0.1     07030  Jan 4
erica meyers    1234 Smith Lane Hoboken NJ  127.0.0.1    07030  March 2
erica meyers    1234 Smith Lane Hoboken NJ  192.168.1.1  07030  april 5

Вот где я сейчас нахожусь (прочтите csv, разделите столбцы по разделителю табуляции, напечатайте первые 100 строк):

import csv
import re
        
Num = 5000
        
with open('test.csv', newline='', encoding="cp437", errors='ignore') as csvfile:
    reader = csv.reader(csvfile, delimiter='\t')
    for i in range(Num):
        lines = next(reader)

Первые несколько строк текущего вывода:

['john smith', '1132 Anywhere Lane Hoboken NJ', '10.0.0.1', ' 07030', 'Jan 4']
['john smith', '1234 Smith Lane Hoboken NJ', '127.0.0.1', ' 07030', 'March 2']
['smith john', '1234 Smith Lane Hoboken NJ', '192.168.1.1', ' 07030', 'april 5']

вот где я застрял ...

Я хочу выполнить поиск регулярного выражения \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} по всем столбцам в каждой строке и вывести номер индекса столбца, в котором было наибольшее количество совпадений с регулярным выражением.

для этого примера \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} будет соответствовать

10.0.0.1
127.0.0.1
192.168.1.1

, поэтому желаемый результат будет:

2

1 Ответ

1 голос
/ 05 августа 2020

Вы можете сделать это с помощью pandas вот так

df=pd.read_csv(path, nrows=5000, sep="\t")

Напишите функцию для проверки совпадения регулярного выражения.

def check_regex_matches(x):
    
    return bool(re.match(regex, x))

Затем вы можете использовать

list_of_bools_where_regex_matches = df["some_col"].apply(lambda
 x:check_regex_match(x))

df["some_col"][list_of_bools_where_regex_matches].index 

Примечание: Пожалуйста, проверьте, требуется ли вам повторное сопоставление или повторный поиск { ссылка }

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