2016-08-18 3 views
1

У меня есть текстовый файл с таким форматом:Как анализировать определенные текстовые данные?

B2100 Door Driver Key Cylinder Switch Failure B2101 Head Rest Switch Circuit Failure B2102 Antenna Circuit Short to Ground`, plus 1000 lines more.

Это, как я хочу, чтобы это было:

B2100*Door Driver Key Cylinder Switch Failure B2101*Head Rest Switch Circuit Failure B2102*Antenna Circuit Short to Ground B2103*Antenna Not Connected B2104*Door Passenger Key Cylinder Switch Failure

так, что я могу скопировать эти данные в LibreOffice Calc и он будет отформатировать его на две колонки кода и означать каждый.

Моего мыслительный процесс:
Применить регулярный экспресс над Bxxxx и поставить звездочку перед ним (он выступает в качестве разделителя) и \n до значения (? Я не знаю, если это будет работать), и удалите пробел до следующего символа.

Я пытаюсь изолировать B2100 и провалился до сих пор. Моя наивная попытка:

import re 

text = """B2100 Door Driver Key Cylinder Switch Failure B2101 Head Rest Switch Circuit Failure B2102 Antenna Circuit Short to Ground B2103 Antenna Not Connected B2104 Door Passenger Key Cylinder Switch Failure B2105 Throttle Position Input Out of Range Low B2106 Throttle Position Input Out of Range High B2107 Front Wiper Motor Relay Circuit Short to Vbatt B2108 Trunk Key Cylinder Switch Failure""" 
# text_arr = text.split("\^B[0-9][0-9][0-9][0-9]$\gi"); 
l = re.compile('\^B[0-9][0-9][0-9][0-9]$\gi').split(text) 
print(l) 

Это выходы:

['B2100\tDoor Driver Key Cylinder Switch Failure B2101\tHead Rest Switch Circuit Failure B2102\tAntenna Circuit Short to Ground B2103\tAntenna Not Connected B2104\tDoor Passenger Key Cylinder Switch Failure B2105\tThrottle Position Input Out of Range Low B2106\tThrottle Position Input Out of Range High B2107\tFront Wiper Motor Relay Circuit Short to Vbatt B2108\tTrunk Key Cylinder Switch Failure'] 

Как достичь желаемого результата?

Чтобы разбить его дальше, что я хочу сделать это:
ломаются все в код (B1001) и значение (текст после него) массив, а затем применить каждую операцию (\n вещь) на нем индивидуально. Если у вас есть лучшие идеи о том, как сделать все это, тем лучше. Я хотел бы услышать это.

+0

да есть ... Но это кажется случайным. –

+0

'replace ('B21', '\ nB21')'? –

ответ

5

В принципе, вы хотите:

  • Найти все строки Bxxxx на входе.
  • Замените пробелы перед ними новой строкой.
  • Замените пробелы после них *.

Это может быть сделано с помощью одного re.sub():

re.sub(r'\s*(B\d{4})\s*', r'\n\1*', text).strip() 

Совпадение картина:

\s*    # Any amount of whitespace 
    (B\d{4})  # "B" followed by exactly 4 digits 
      \s* # Any amount of whitespace 

Замена модели:

\n    # Newline 
    \1    # The first parenthesized sequence from the matching pattern (B####) 
    *   # Literal "*" 

Целью strip() является обрезать любые ведущие или tr в том числе новую строку, которая будет получена из подполя первой последовательности B ####.

+0

Вы что-нибудь регулярное выражение ниндзя? Черт, что сработало ... Спасибо тонну –

0

Во-первых, ваше регулярное выражение неверно «\^B [0-9] [0-9] [0-9] [0-9] $ \ ГИ

  1. модификаторы не работают таким образом, на Python
  2. Значения^и $ означают начало и конец строки, которая не соответствует чему-либо в вашем тексте
  3. Множители [0-9] могут быть заменены на «[0-9] { 4} '
  4. Если вы хотите игнорировать дело, используйте соответствующую информацию на Python regex

Имея это в виду простой код, чтобы добиться того, что вы хотите что-то вроде этого:

l = [x.strip() for x in re.compile('\s*(B\d{4})\s*', re.IGNORECASE).split(text)] 
lines = ['*'.join(l[i:i+2]) for i in range(0,len(l),2)] 
+0

Не совсем ответ – Frodon

0
import re 
text = """B2100 Door Driver Key Cylinder Switch Failure B2101 Head Rest Switch Circuit Failure B2102 Antenna Circuit Short to Ground B2103 Antenna Not Connected B2104 Door Passenger Key Cylinder Switch Failure B2105 Throttle Position Input Out of Range Low B2106 Throttle Position Input Out of Range High B2107 Front Wiper Motor Relay Circuit Short to Vbatt B2108 Trunk Key Cylinder Switch Failure""" 

l = [i for i in re.split('(B[0-9]{4}\s+)', text) if i] 
print '\n'.join(['{}*{}'.format(id_.strip(), label.strip()) for id_,label in zip(l[0::2], l[1::2])]) 

.split может держать разделители после расщепления, если вы включите() вокруг регулярных выражений. Выше производит вывод:

B2100*Door Driver Key Cylinder Switch Failure 
B2101*Head Rest Switch Circuit Failure 
B2102*Antenna Circuit Short to Ground 
B2103*Antenna Not Connected 
B2104*Door Passenger Key Cylinder Switch Failure 
B2105*Throttle Position Input Out of Range Low 
B2106*Throttle Position Input Out of Range High 
B2107*Front Wiper Motor Relay Circuit Short to Vbatt 
B2108*Trunk Key Cylinder Switch Failure 
0

импорта повторно

импорта панды как Pd

погладить = г "(В \ D +)"

ZZZ = [я для я в re.split (погладить, ККК), если я! = '']

pd.DataFrame ({'Col1': zzz [:: 2], 'Col2': [i.strip() для i в zzz, если re.match (pat, i) - None] })

Col1 Col2

0 B2100 двери водителя ключ Цилиндровый Неисправность переключателя

1 B2101 подголовника Выключатель цепи Отказ

2 B2102 антенны Короткое замыкание на массу 3 B2100 двери водителя ключ Цилиндровый Неисправность переключателя

Смежные вопросы