Как по-разному заменить некоторые слэши на регулярные выражения? - PullRequest
0 голосов
/ 23 января 2019

Допустим, у меня есть следующие строки:

this_string = 'US/Canada'

that_string = '/fowardslash @/t t/'

Я хочу иметь возможность re.sub() строк с этими 2 целями:

1) заменить все /, которые не имеет буквы до и после него с ничем ''.

2) заменяет все /, которые имеет букву до и после нее, напробел.

То, что я хочу закончить, будет примерно таким:

this_string = 'US Canada'

that_string = 'forwardslash @t t' 

У меня в настоящее время есть re.sub('[^A-Za-z0-9\s]+','', this_string)

, который выполняет1-й гол, но не 2-й.

Я бы получил this_string = 'USCanada'

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Вы можете использовать

import re
s = '''US/Canada
/fowardslash @/t t/'''
rx = r'(?<=[^\W\d_])/(?=[^\W\d_])|(/)'
print(re.sub(rx, lambda m: '' if m.group(1) else ' ', s))
# => US Canada
#    fowardslash @t t

См. Демо Python 3 онлайн .

регулярное выражение соответствует

  • (?<=[^\W\d_])/(?=[^\W\d_]) - -, окруженный любой буквой Юникода
  • | - или
  • (/) - (группа захвата 1) символ / в любом другом контексте.

Если группа 1 не пуста, если она соответствует, совпадение удаляется, в противном случае оно заменяется пробелом.

0 голосов
/ 23 января 2019

Вы можете использовать re.sub () с собственной функцией замены.

Пример:

import re

this_string = 'US/Canada'
that_string = '/fowardslash @/t t/'

def myreplace(match):
    if match.group(1) is not None and match.group(2) is not None:
        return match.group(1) + ' ' + match.group(2)
    else:
        return ''

print(re.sub(r'(?:([A-Za-z0-9]+)/([A-Za-z0-9]+))|(/)', myreplace, this_string))
print(re.sub(r'(?:([A-Za-z0-9]+)/([A-Za-z0-9]+))|(/)', myreplace, that_string))
0 голосов
/ 23 января 2019

Может, наоборот?

text = re.sub(r'\b/\b' , ' ' , text) # Replace with space
text = re.sub(r'/'     , ''  , text) # Remove

Или:

text = re.sub(r'/', '', re.sub(r'\b/\b', ' ', text))
0 голосов
/ 23 января 2019

Вы можете использовать re.sub('\/', ' ', this_string) для второго гола, \ экранирует символ / и приводит к тому, что вам нужно.

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

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