Замените «-» пробелом, если следующая буква представляет собой букву, а не цифру, и удалите, когда она находится в начале - PullRequest
3 голосов
/ 22 мая 2019

У меня есть список строк, т.е.

slist = ["-args", "-111111", "20-args", "20 - 20", "20-10", "args-deep"]

Я хочу удалить '-' из строки, где это первый символ, за которым следуют строки, но не цифры илиесли перед '-' стоит число / алфавит, но после алфавита, то он должен заменить '-' на пробел

Так что для списка slist Я хочу вывод как

["args", "-111111", "20 args", "20 - 20", "20-10", "args deep"]

Я пробовал

slist = ["-args", "-111111", "20-args", "20 - 20", "20-10", "args-deep"]
nlist = list()
for estr in slist:
    nlist.append(re.sub("((^-[a-zA-Z])|([0-9]*-[a-zA-Z]))", "", estr))
print (nlist)

и я получаю вывод

['rgs', '-111111', 'rgs', '20 - 20', '20-10', 'argseep']

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Одним из вариантов может быть сделать 2 раза замену. Сначала сопоставьте дефис в начале, когда следуют только алфавиты:

^-(?=[a-zA-Z]+$)

Regex demo

В замене используйте пустую строку.

Затем захватите 1 или более раз алфавит или цифру в группе 1, сопоставьте -, а затем захватите 1+ раз алфавит в группе 2.

^([a-zA-Z0-9]+)-([a-zA-Z]+)$

Regex demo

В качестве замены используйте r"\1 \2"

Например

import re

regex1 = r"^-(?=[a-zA-Z]+$)"
regex2 = r"^([a-zA-Z0-9]+)-([a-zA-Z]+)$"

slist = ["-args", "-111111", "20-args", "20 - 20", "20-10", "args-deep"]
slist = list(map(lambda s: re.sub(regex2, r"\1 \2", re.sub(regex1, "", s)), slist))

print(slist)

Результат

['args', '-111111', '20 args', '20 - 20', '20-10', 'args deep']

Демо Python

1 голос
/ 26 мая 2019

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

nlist.append(re.sub(r"-(?=[a-zA-Z])", " ", estr).lstrip())

или

nlist.append(re.sub(r"-(?=[^\W\d_])", " ", estr).lstrip())

Результат: ['args', '-111111', '20 args', '20 - 20', '20-10', 'args deep']

См. Демонстрационную версию Python .

Шаблон -(?=[a-zA-Z]) соответствует дефису перед буквой ASCII (-(?=[^\W\d_]) соответствует дефису перед любой буквой) и заменяет совпадение пробелом. Поскольку - может совпадать в начале строки, пробел может появиться в этой позиции, поэтому .lstrip() используется для удаления пробелов там.

1 голос
/ 22 мая 2019

Здесь мы могли бы просто захотеть захватить первую букву после начального -, а затем заменить ее только на эту букву, возможно, на выражение флага i, подобное:

^-([a-z])

ДЕМО

enter image description here

Тест

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"^-([a-z])"

test_str = ("-args\n"
    "-111111\n"
    "20-args\n"
    "20 - 20\n"
    "20-10\n"
    "args-deep")

subst = "\\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE | re.IGNORECASE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Демо

const regex = /^-([a-z])/gmi;
const str = `-args
-111111
20-args
20 - 20
20-10
args-deep`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

RegEx

Если это выражение нежелательно, его можно изменить или изменить в regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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