2

I am trying to get my Python program to cycle through a list of unwanted characters that I wrote in a list. I want it to use a for functions to replace those characters with "_" in a string.

global string
global OddChars
string = "Parenthesis: () Brackets: []"
OddChars = ["[", "]", "(", ")", " "]

for Replace in OddChars:
       string = string.replace(Replace, "_")
print (string)

I want the new string to have _ instead of ()[] and spaces. When I try this it doesn't work, it prints the same string as before.

4
  • This works for me in IDLE, without the global declarations Commented Feb 16, 2014 at 23:30
  • 1
    I think you have a scope problem. Is global string outside the function or inside it? Show us runnable code that demonstrates the problem when you run it. Commented Feb 16, 2014 at 23:32
  • Ya, I got it to work now. I think my IDLE was just being derpy. Commented Feb 16, 2014 at 23:34
  • @user3024151 does my below answer work for you? Commented Feb 17, 2014 at 0:03

4 Answers 4

2

For this type of operation, use the str.translate method.

Python 2

In Python 2, we use the string module's maketrans function to create a translation table. (Be sure not to overwrite the string module, I changed your variable name, string to mystring below.)

>>> import string
>>> my_string = "Parenthesis: () Brackets: []"
>>> OddChars = ["[", "]", "(", ")", " "] # unused, but I could join for below
>>> string.maketrans('[]() ', '_____') # <- 1st arg would be ''.join(OddChars)
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f_!"#$%&\'__*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_\\_^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
>>> translation_table = string.maketrans('[]() ', '_____')
>>> my_string.translate(translation_table)
'Parenthesis:____Brackets:___'

You could make this into a reusable function:

import string

def replace_chars(my_string, old_chars, new_chars):
    translation_table = string.maketrans(old_chars, new_chars)
    return my_string.translate(translation_table)

Python 3

In Python 3, the string module doesn't have this functionality, it has been moved as a static method to the builtin str (which means you could call it from str or an instance of a string, like my_string below):

>>> my_string = "Parenthesis: () Brackets: []"
>>> translation_table = str.maketrans('[]() ', '_____') # str could be my_string 
>>> translation_table
{40: 95, 41: 95, 91: 95, 93: 95, 32: 95}
>>> my_string.translate(translation_table)
'Parenthesis:____Brackets:___'

The function could look like this:

def replace_chars(my_string, old_chars, new_chars):
    return my_string.translate(str.maketrans(old_chars, new_chars))
Sign up to request clarification or add additional context in comments.

2 Comments

In Python3, you don't import string. Just use str.maketrans() instead
Thanks @gnibbler for bringing this to my attention. I have now addressed that issue.
1
>>> input_string = "Parenthesis: () Brackets: []"
>>> temp_string = ''
>>> odd_chars = ["[", "]", "(", ")", " "]
>>> for odd_char in odd_chars:
...     temp_string = input_string.replace(odd_char, "_")
...     input_string = temp_string
... 
>>> print input_string
Parenthesis:____Brackets:___

I tried to correct your solution. Your logic was little incorrect. After first replace you were not passing updated string for other odd chars in the iteration.

Comments

1
>>> s = "Parenthesis: () Brackets: []"
>>> o = ["[", "]", "(", ")", " "]
>>> "".join(["_" if c in o else c for c in s])
'Parenthesis:____Brackets:___'

2 Comments

or "".join(i if i not in OddChars else "_" for i in list(string))
Declarative as python may be, I would recommend expanding your answer to include some explanation English text.
1
  1. Simply import regex module in your program
  2. Be careful of using escape caracter \ before the character in you list and transform it to a string to make a string replacement if you don't want to rewrite your list just add "|\".join(OddChar) and the OR option in regex but in your example it's not necessary
  3. Just use the submodule re.sub, Tip:if you want a better performance you can compile your expression by using re.compile

import re

OddChar2str = OddChar.join("|\")

your oddchar is now equivalent to "\(|\)|\[|\]"

replace = re.sub(OddChar2str, '_', string)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.