#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=
перед всеми захватами, поэтому я только что создал группу захвата, не стесняйтесь добавлять группу без захвата, если это имеет значение.