Манипулирование строками в Python - PullRequest
1 голос
/ 15 февраля 2010

У меня есть случайно сгенерированная строка из 6 букв в этой форме, пример:

A' B F2 E' B2 A2 C' D2 C D' E2 F

К некоторым буквам добавлено "'", а к некоторым добавлено число "2". Я хочу добавить букву «х» к каждой букве, которая сама по себе.

Так бы это выглядело так:

A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx

Хитрость заключается в том, что он добавляет «х» только к тем буквам, которые находятся сами по себе. Нет, Bx -> Bx2.

Есть идеи?

Ответы [ 7 ]

5 голосов
/ 15 февраля 2010

Преобразуйте вашу строку в список с помощью split ()

s = """A' B F2 E' B2 A2 C' D2 C D' E2 F"""

L = s.split(' ')

for i in xrange(len(L)):
  if len(L[i]) == 1:
    L[i] += 'x'

str_out = ' '.join(L)
4 голосов
/ 15 февраля 2010

Версия split-comprehend-join:

' '.join(n+'x' if len(n)==1 else n for n in inputstr.split(' '))

Регулярное выражение:

>>> inputstr = "A' F B2 C"
>>> re.sub(r'([A-Z])(?=\s|$)', r'\1x', inputstr)
"A' Fx B2 Cx"

По сути, найдите любую заглавную букву, за которой не следует ни пробел, ни конец строки, и замените ее тем символом, за которым следует x.

Я провел несколько тестов с timeit ; первый (составление списка), кажется, работает немного быстрее, чем второй (в среднем на 15-20% быстрее). Похоже, что это не изменится, независимо от количества замен, которые должны быть выполнены (длина строки в 10 раз по-прежнему примерно такая же, как у оригинала).

3 голосов
/ 15 февраля 2010

Гадкий или Пифонический?

items = "A' B F2 E' B2 A2 C' D2 C D' E2 F".split()

itemsx = ((a+'x' if len(a)==1 else a) for a in items)
out = ' '.join(itemsx)
2 голосов
/ 15 февраля 2010

С регулярным выражением,

import re
newstring = re.sub(r"\b(\w)(?![2'])", r'\1x', oldstring)

должно быть в порядке. Если у вас аллергия на re с,

news = ' '.join(x + 'x' if len(x)==1 else x for x in olds.split())

- это краткий способ выражения аналогичного преобразования (если длина-один действительно единственная вещь, которую вам нужно проверить перед добавлением 'x' к элементу).

1 голос
/ 15 февраля 2010
>>> ' '.join((i+'x')[:2] for i in items.split())
"A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx"
1 голос
/ 15 февраля 2010
>>> s="A' B F2 E' B2 A2 C' D2 C D' E2 F".split()
>>> import string
>>> letters=list(string.letters)
>>> for n,i in enumerate(s):
...     if i in letters:
...        s[n]=i+"x"
...
>>> ' '.join(s)
"A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx"
>>>
1 голос
/ 15 февраля 2010
' '.join(n if len(n) == 2 else n + 'x' for n in s.split(' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...