Извлечение информации из строки и преобразование в список

#python #python-3.x #regex

#python #python-3.x #регулярное выражение

Вопрос:

У меня есть строка, подобная приведенной ниже:

 [Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=250.44,Y=223.48499) height=3.5324998 width=4.2910004]DECEMBER 31,

[Base Font : IOFOEO Imago-Book, Font Size : 3.876, Font Weight : 0.0] [(X=307.5,Y=240.48499) height=3.876 width=2.9970093]respectively. The net decrease in the revenue

[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=49.5,Y=233.98499) height=3.5324998 width=2.5690002](US$ in millions)
  

Я хочу извлечь значение «X» и связанный с ним текст и преобразовать его в список. Пожалуйста, смотрите ожидаемый результат ниже:

Ожидаемый результат:

 ['X=250.44','DECEMBER 31,']
['X=307.5','respectively. The net decrease in the revenue']
['X=49.5','(US$ in millions)']
  

Как мы можем подойти к этому в Python?

Мой подход:

 mylist = []
for line in data.split("n"):
    if line.strip():
        x_coord = re.findall('^(X=.*),$', line)
        text = re.findall('^(]w  )', line)
        mylist.append([x_coord, text])
  

Мой подход не определяет никакого значения для x_coord and text .

Комментарии:

1. Взгляните на str.split функцию или библиотеку регулярных выражений Python.

2. Я бы пошел по этому re пути

3. str.split() может не работать, но определенно должно использоваться регулярное выражение. Я не могу извлечь информацию с помощью регулярных выражений и преобразовать в список, поэтому я подошел к ЭТОМУ.

Ответ №1:

re решение:

 import re

input = [
    "[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=250.44,Y=223.48499) height=3.5324998 width=4.2910004]DECEMBER 31,",
    "[Base Font : IOFOEO Imago-Book, Font Size : 3.876, Font Weight : 0.0] [(X=307.5,Y=240.48499) height=3.876 width=2.9970093]respectively. The net decrease in the revenue",
    "[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=49.5,Y=233.98499) height=3.5324998 width=2.5690002](US$ in millions)",
]

def extract(s):
    match = re.search("(X=d (?:.d*)?).*?](.*?)$",s)
    return match.groups()

output = [extract(item) for item in input]
print(output)
  

Вывод:

 [
    ('X=250.44', 'DECEMBER 31,'),
    ('X=307.5', 'respectively. The net decrease in the revenue'),
    ('X=49.5', '(US$ in millions)'),
]

  

Объяснение:

  • d … цифра
  • d … одна или несколько цифр
  • (?:...) … не захватывающие («обычные») круглые скобки
  • .d* … точка, за которой следует ноль или более цифр
  • (?:.d*)? … необязательная (ноль или единица) «десятичная часть»
  • (X=d (?:.d*)?) … первая группа, X=number
  • .*? … ноль или более любого символа (не жадный)
  • ] ] символ
  • $ … конец строки
  • ](.*?)$ … вторая группа, все, что находится между ] и в конце строки

Ответ №2:

Использование регулярных выражений с именованными группами для захвата соответствующих битов:

 >>> line = "[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=250.44,Y=223.48499) height=3.5324998 width=4.2910004]DECEMBER 31,"
>>> m = re.search(r'(?:(X=)(?P<x_coord>.*?)(?:,.*])(?P<text>.*)$', line)
>>> m.groups()
('250.44', 'DECEMBER 31,')
>>> m['x_coord']
'250.44'
>>> m['text']
'DECEMBER 31,'
  

Ответ №3:

Попробуйте это:

 (X=[^,]*)(?:.*])(.*)
  
 import re

source = """[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=250.44,Y=223.48499) height=3.5324998 width=4.2910004]DECEMBER 31,
[Base Font : IOFOEO Imago-Book, Font Size : 3.876, Font Weight : 0.0] [(X=307.5,Y=240.48499) height=3.876 width=2.9970093]respectively. The net decrease in the revenue
[Base Font : IOHLGA Trebuchet, Font Size : 3.5324998, Font Weight : 0.0] [(X=49.5,Y=233.98499) height=3.5324998 width=2.5690002](US$ in millions)""".split('n')

pattern = r"(X=[^,]*)(?:.*])(.*)"

for line in source:
    print(re.search(pattern, line).groups())
  

Вывод:

 ('X=250.44', 'DECEMBER 31,')
('X=307.5', 'respectively. The net decrease in the revenue')
('X=49.5', '(US$ in millions)')
  

У вас есть X= перед всеми захватами, поэтому я только что создал группу захвата, не стесняйтесь добавлять группу без захвата, если это имеет значение.