2017-01-27 2 views
1

Я пытаюсь извлечь динамическое значение (статические символы) из файла csv в определенном столбце и вывести значение в другой csv.'~', приводящий к нулевым результатам в скрипте python

Элемент данных, который я пытаюсь извлечь, это «12385730561818101591» из значения «callback=B~12385730561818101591», расположенного в определенном столбце.

Я написал ниже сценарий python, но результаты вывода всегда пусты. Регулярное выражение '=(~[0-9]+)' было проверено на успешное извлечение значения «12385730561818101591». Это было проверено на www.regex101.com.

Когда я использую это в Python, результаты не отображаются в выходном файле. У меня такое чувство, что «~» вызывает ошибку. Когда я попытался найти «~» в исходном CSV-файле, результаты не найдены, но он есть!

Может сообщество помочь мне следующее:

(1) Определить первопричину без выхода и проверить, если «~» является проблемой. Может ли проблема также заключаться в том, как я разбиваю строки? Я не уверен, что строки должны быть разделены на ';' вместо ','.

import csv 
import sys 
import ast 
import re 
filename1 = open("example.csv", "w") 

with open('example1.csv') as csvfile: 

data = None 
patterns = '=(~[0-9]+)' 
data1= csv.reader(csvfile) 
for row in data1: 
    var1 = row[57] 
    for item in var1.split(','): 
     if re.search(patterns, item): 
      for data in item: 
       if 'common' in data: 
        filename1.write(data + '\n') 
filename1.close() 
+0

Можете вложить первые 2-3 строки вашего csv-файла? – MYGz

+0

Тильда не вызывает особых проблем, ваш шаблон неправильный, это проблема. Как вы описываете B после '=' в вашем шаблоне? –

+0

Чтобы узнать, что является разделителем, посмотрите на свой файл. –

ответ

0

Вы регулярное выражение неправильно для примера:

=(~[0-9]+) никогда не будут соответствовать callback=B~12385730561818101591 из-за B после = и перед ~. Также вы включаете ~ в группу захвата.

Не уверен, что ваша цель, но это может сработать. Дайте более подробную информацию, если у вас больше ограничений.

=.+~([0-9]+) 

EDIT

После новой предоставленной информации:

patterns = '=.+~([0-9]+)' 
... 
    result = re.search(patterns, item): 
    number = result.group(0) 
    filename1.write(number + '\n') 
... 

Об разделенной линии на \ т (табулирования) вы должны показать пример полной линии

+0

Привет, мои извинения за ответ так поздно. Моя цель - просто извлечь «12345678910235455» из «callback = B ~ 12345678910235455» и записать в отдельный файл CSV. Есть около 5000 из этих callback = B ~ 12345678910235455 с уникальными номерами, поэтому я хотел написать '12345678910235455' + '\ n' в новый CSV-файл. Столбцы также разделяются вкладкой, а не запятой. Кстати, знаете ли вы о каких-либо хороших ресурсах для обучения регулярному выражению. Я в этом начинаю. – Brandon

+0

Я попытался заменить элемент в var1.split (',') WITH для элемента в var1.split ("\ t"), и я все еще получаю нулевые результаты в выведенном CSV-файле. – Brandon

+0

Кроме того, полная строка внутри столбца, содержащая 'callback = B ~ 1234567891012', выглядит так:/common/navigation /? Callback = B ~ 1234567891012 '. – Brandon

0

Здесь я попытался написать пример кода. Надеюсь, это поможет вам в решении проблемы:

import re 
str="callback=B~12385730561818101591" 
rc=re.match(r'.*=B\~([0-9A-Ba-b]+)', str) 
print rc.group(1)