Как разобрать строку на две разные строки на основе первого экземпляра целого числа? (Python)

#python #string

#питон #строка #python

Вопрос:

Я пытаюсь взять строку типа «PR405j» и разделить ее на две строки. В этом случае двумя строками будут «PR» и «405j». Существует множество строк, с которыми я должен это сделать. Примеры: «ACR498» будет «ACR» и «498», «FR707e» будет «FR» и «707e», «TY699l» будет «TY» и «699l» и так далее, и тому подобное.

Проблема, с которой я столкнулся, заключается в отделении первой части от второй. Количество символов с обеих сторон различается, и вторая строка (та, что с цифрами) также может содержать или не содержать буквенные символы. Единственная общность между всеми этими строками заключается в том, что вы можете разделить их на основе первого экземпляра целого числа.

Я думал, что цикл for, который проходит через каждый символ в исходной строке и создает две отдельные строки внутри, будет работать, но я мог думать только о том, чтобы основывать разделение на целых числах и буквенных символах, что сделало бы что-то вроде «PR405j» превращенным в «PRj» и «405».

Я также думал, что метод разделения строк поможет, но нет ни одного символа, который был бы общим для всех этих строк.

Наконец, я не могу разделить строки на основе количества буквенных символов в начале строки (скажем, 2 для «PR405j»), потому что между строками есть различия.

Если бы кто-нибудь мог помочь мне с этим, я был бы очень признателен. Спасибо!

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

1. re Было бы ''.join(itertools.takewhile(operator.methodcaller('isalpha'), thestring)), ''.join(itertools.dropwhile(operator.methodcaller('isalpha'), thestring)) альтернативой, но не используйте это.

2. И что вы хотите, чтобы произошло, если (1) строка не начинается ни с одного алфавита (2) за буквами не следуют никакие цифры?

Ответ №1:

Вы можете использовать регулярные выражения для выполнения простого сопоставления строк, такого как это. Выражение ‘(D )(. )’ гласит ‘Извлеките одну или несколько нецифровых строк в качестве первой группы, затем извлеките один или несколько других символов в качестве второй.’

 import re

inputs = ['PR405j']

for input in inputs:
    match = re.match('(D )(. )', input)

    start = match.group(1)
    end = match.group(2)

    print input, start, end
  

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

1. Вероятно, вам могло бы сойти с рук (. ) вместо (d. )

2. Одна строка будет start, end = re.match(r'(D )(. )', input).groups() .

3. @F.J: Не повезло, если совпадения нет. Однострочники не находят большого применения в реальном мире.

4. @ZackBloom: OP хочет начать с алфавитов, а не без цифр.

5. @JohnMachin Поскольку он не знаком с регулярным выражением, я выбрал самый простой пример, который мог бы сработать. Но, при необходимости, более точное выражение может быть ^([A-Z]{2,})(d[a-zA-Z0-9] )$ .

Ответ №2:

РЕДАКТИРОВАТЬ: я неправильно понял вопрос, думал, вам нужны 3 группы, а не две. Ответ Зака Блума более правильный, но я оставлю это здесь в качестве ссылки на случай, если у кого-то возникнет подобный вопрос.


Вы можете использовать re.split :

 >>> re.split(r'(d )', 'PR405j')
['PR', '405', 'j']
  

Хитрость здесь заключается в использовании группы захвата (в круглых скобках) в качестве регулярного выражения для разделения; это приведет к тому, что выходные данные будут содержать части, которые вызвали разделение, а также части по обе стороны от него. Если у вас есть строка с несколькими группами цифр, разделенных не цифрами, это полностью разделит строку:

 >>> re.split(r'(d )', 'PR405j123abc')
['PR', '405', 'j', '123', 'abc']
  

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

1. Это не разбивается PR405j на PR и 405j .

Ответ №3:

повторно разделите, как и остальные ответы. Но вы должны использовать его, чтобы справиться с группировкой:

 import re
re.split(r'([a-zA-Z] )', 'PR405j', 1)[1:]