2014-10-14 8 views
0

Я не могу решить эту проблему. У меня много разных строк, и они всегда разные. Мне нужно заменить их концы, но они всегда разные. Вот пример пары строк:Замена некоторых частей строки Python

string1 = "thisisnumber1(111)" 
string2 = "itsraining(22252)" 
string3 = "fluffydog(3)" 

Теперь, когда я печатаю это из него, конечно, напечатать следующее:

thisisnumber1(111) 
itsraining(22252) 
fluffydog(3) 

Что я хотел бы, чтобы напечатать хотя и последующие:

thisisnumber1 
itsraining 
fluffydog 

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

+0

Вам нужно беспокоиться, например, '' thishasparens (butnotanumber) "или' "thishasunclosedparens (10" или 'this thishastwosets (10) (20)" или "thishasparens (123) thenmore (456) «или что-нибудь еще подобное? Если да, то что вы хотите сделать для каждого из этих случаев? – abarnert

+0

Нет, все, что будет в круглых скобках, будет цифрами :) –

ответ

4

Вы можете использовать str.rsplit для этого:

>>> string1 = "thisisnumber1(111)" 
>>> string2 = "itsraining(22252)" 
>>> string3 = "fluffydog(3)" 
>>> 
>>> string1.rsplit("(") 
['thisisnumber1', '111)'] 
>>> string1.rsplit("(")[0] 
'thisisnumber1' 
>>> 
>>> string2.rsplit("(") 
['itsraining', '22252)'] 
>>> string2.rsplit("(")[0] 
'itsraining' 
>>> 
>>> string3.rsplit("(") 
['fluffydog', '3)'] 
>>> string3.rsplit("(")[0] 
'fluffydog' 
>>> 

str.rsplit разбивает строку справа налево, а не слева направо, как str.split. Итак, мы разделили строку справа налево на (, а затем извлекли элемент по индексу 0 (первый элемент). Это будет все до (...) в конце каждой строки.

+0

Для обеспечения того, чтобы операция была только на конце строки, которую вы, возможно, захотите ограничить одним разделом для обработки строк, таких как «flu (ffy) dog (3)», например, 'rsplit (« flu (ffy) dog (3) », 1)'. – mhawke

+0

@mhawke: С другой стороны, откуда вы знаете, что 'flu (ffy) dog' будет желательным выходом в этом случае, в отличие от' fludog' или 'flu'? (Вот почему я спросил ОП, который подтвердил, что ни один из этих случаев не существует в его данных, что означает, что этого ответа достаточно.) – abarnert

+0

@abarnert: в ретроспективе, да. OP выполнил замену конца строки, и мое предложение ограничивает это тем, что, не предполагая, что данные не содержат никаких дополнительных левых парен. – mhawke

0

Так вы говорите, в комментарии:

«все, что будет в скобках будет номера»

, так что вы всегда будете иметь цифры между вашими скобками, я бы рекомендовал взглянуть на удаление их с помощью регулярного модуля выражения:

import re 

string1 = "thisisnumber1(111)" 
string2 = "itsraining(22252)" 
string3 = "fluffydog(3)" 

strings = string1, string2, string3 

for s in strings: 
    s_replaced = re.sub(
     r''' 
     \(# must escape the parens, since these are special characters in regex 
     \d+ # one or more digits, 0-9 
     \) 
     ''', # this regular expression will be replaced by the next argument 
     '', replace the above with an empty string 
     s, # the string we're modifying 
     re.VERBOSE) # verbose flag allows us to comment regex clearly 
    print(s_replaced) 

печатает:

thisisnumber1 
itsraining 
fluffydog 
1

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

import re 
regex = regex = r"(.+)\(\d+\)" 

print re.match(regex, string1).groups()[0] #returns thisisnumber1 
print re.match(regex, string2).groups()[0] #returns itsraining 
print re.match(regex, string3).groups()[0] #returns fluffydog 

Разбивка, что происходит:

regex = r"(.+)\(\d+\)" является регулярное выражение, то формула для строки, которую вы пытаетесь найти

.+ означает матч 1 или больше символов любого рода, кроме символа новой строки

\d+ означает совпадение 1 или более цифр

\( и \) являются «(» и «)» символы

кладя .+ в скобках помещает эту строку последовательность в группе, а это означает, что группа символов один, что вы хотите, чтобы иметь возможность получить доступ позже. Мы не ставим последовательность \(\d+\) в группу, потому что нас не волнуют эти символы.

regex.match(regex, string1).groups() дает каждую подстроку в string1, которая была частью группы. Поскольку вам нужна только одна подстрока, вы просто получаете доступ к 0-му элементу.

Если вы хотите узнать больше, есть хорошее учебное пособие по регулярным выражениям в Point of Tutorial's Point here.

Смежные вопросы