Возврат всех символов перед первым подчеркиванием - PullRequest
6 голосов
/ 21 сентября 2010

Используя re в Python, я хотел бы вернуть все символы в строке, которые предшествуют первому появлению подчеркивания. Кроме того, я хотел бы, чтобы возвращаемая строка была в верхнем регистре и без любых не буквенно-цифровых символов.

Например:

AG.av08_binloop_v6 = AGAV08
TL.av1_binloopv2   = TLAV1

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

Для дальнейшего пояснения, приведенные выше примеры не являются фактическими строками. Фактическая строка будет выглядеть так:

AG.av08_binloop_v6

С моим желаемым выводом, похожим на:

AGAV08

И следующий пример будет таким же. Строка:

TL.av1_binloopv2

Желаемый вывод:

TLAV1

Еще раз спасибо всем за помощь!

Ответы [ 6 ]

19 голосов
/ 21 сентября 2010

Даже без re:

text.split('_', 1)[0].replace('.', '').upper()
7 голосов
/ 21 сентября 2010

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

re.sub("[^A-Z\d]", "", re.search("^[^_]*", str).group(0).upper())
3 голосов
/ 21 сентября 2010

Так как каждый дает свою любимую реализацию, вот моя, которая не использует re:

>>> for s in ('AG.av08_binloop_v6', 'TL.av1_binloopv2'):
...     print ''.join(c for c in s.split('_',1)[0] if c.isalnum()).upper()
...
AGAV08
TLAV1

Я положил .upper() на внешней стороне генератора, поэтому он вызывается только один раз.

2 голосов
/ 21 сентября 2010

У него, просто для удовольствия, есть еще один вариант получения текста перед первым подчеркиванием:

before_underscore, sep, after_underscore = str.partition('_')

Таким образом, все в одной строке может быть:

re.sub("[^A-Z\d]", "", str.partition('_')[0].upper())
2 голосов
/ 21 сентября 2010

Вам не нужно использовать re для этого.Простых строковых операций будет достаточно в зависимости от ваших требований:

tests = """
AG.av08_binloop_v6 = AGAV08
TL.av1_binloopv2   = TLAV1
"""

for t in tests.splitlines(): 
     print t[:t.find('_')].replace('.', '').upper()

# Returns:
# AGAV08
# TLAV1

Или, если вам абсолютно необходимо использовать re:

import re 

pat = r'([a-zA-Z0-9.]+)_.*'
pat_re = re.compile(pat)

for t in tests.splitlines():
    print re.sub(r'\.', '', pat_re.findall(t)[0]).upper()

# Returns:
# AGAV08
# TLAV1
1 голос
/ 21 сентября 2010

импорт ре

re.sub ("[^ A-Z \ d]", "", yourstr.split ('_', 1) [0] .upper ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...