Ну, я полагаю, вы можете попытаться сделать это с помощью регулярного выражения. Если ваш текст в точности такой:
paragraph = 'Name Rakesh Rao Age 34 Gender Male Marital Status Single'
Вы можете использовать это регулярное выражение (сначала вам нужно будет import re
):
m = re.fullmatch(
(
r'Name(?:\:)? (?P<name>\D+) ' # pay attention to the space at the end
r'Age(?:\:)? (?P<age>\d+) '
r'Gender(?:\:)? (?P<gender>\D+) '
r'Marital Status(?:\:)? (?P<status>\D+)' # no space here, since the string ends
),
paragraph
)
Затем вы можете использовать именагруппы, определенные в регулярном выражении, например:
>>> m.group('name')
'Rakesh Rao'
>>> m.group('age')
'34'
>>> m.group('gender')
'Male'
>>> m.group('status')
'Single'
Если все поля находятся в одной строке, вам просто нужно заменить \n
на один пробел в регулярном выражении.
Обратите внимание, что это будет поддерживать одну запятую сразу после имени строки, например:
Name: Rakesh Rao
, но не будет поддерживать другой порядок данных. Если вам это тоже понравится, я могу попробовать написать другое выражение.
Объяснение выражения
Давайте возьмем первую «строку» выражения:
r'Name(?:\:)? (?P<name>\D+) '
Во-первых, почему синтаксис строки r'…'
? Это просто для того, чтобы избежать двойной обратной косой черты. В «типичной» строке нам нужно написать следующее выражение:
'Name(?:\\:)? (?P<name>\\D+) '
Теперь к фактическому выражению. Первая часть, Name
, довольно очевидна.
(?:\:)?
Эта часть создает группу без захвата ((?:…)
) с двоеточием внутри - это \:
, а не просто :
,потому что само двоеточие является частью синтаксиса регулярных выражений. Группа без захвата, потому что это двоеточие для нас действительно не имеет значения.
Затем, после одного пробела, мы имеем это:
(?P<name>\D+)
Это создает именованную группу, синтаксисэто (?P<name_of_the_group>…)
. Я использую именованную группу только для того, чтобы потом было проще и приятнее извлекать информацию, используя m.group('name')
, где m
- объект соответствия.
\D+
означает «хотя бы один нецифровыйхарактер". Это захватывает все буквы, подчеркивания, но также и пробелы. Вот почему порядок полей так важен для этого конкретного выражения. Если бы вы изменили порядок и поместили поле Gender
между Name
и Age
, оно также захватило бы его, потому что модификатор +
жадный.
С другой стороны,\d+
в следующей «строке» означает «хотя бы один символ», поэтому от 0 до 9.
Надеюсь, этого объяснения достаточно, но вам может быть полезно поиграть с этим выражением здесь, на этом очень полезном сайте:
https://regex101.com/r/N5ZJU9/2
Я уже ввел регулярное выражение и тестовую строку для вас.