RegEx для замены цифр в середине буквенно-цифровых строк, но не в конце - PullRequest
4 голосов
/ 23 мая 2019

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

aaaaaaa0aaa
bbbbbbb0bbbbbb
cccccc 2.0

Мне нужно заменить 0 в середине первых 2 строк некоторым символом, таким как «x».Если я использую регулярное выражение r'[0].', то «0a» и «0b» выбираются из первых 2 строк.Как я могу просто выбрать только «0» из первых 2 строк, избегая при этом «0» в последней строке

Ответы [ 5 ]

4 голосов
/ 23 мая 2019

Вы можете использовать \B, чтобы установить границы без слов вокруг совпадающего 0:

\B0\B

Демо: https://regex101.com/r/8GGONp/1

>>> import re
>>> s = '''aaaaaaa0aaa
... bbbbbbb0bbbbbb
... cccccc 2.0'''
>>> print(re.sub(r'\B0\B', 'x', s))
aaaaaaaxaaa
bbbbbbbxbbbbbb
cccccc 2.0
>>>
1 голос
/ 23 мая 2019

Достаточно простого положительного взгляда, как в r'0(?=.)'.Использование python

import re

s = '''aaaaaaa0aaa
bbbbbbb0bbbbbb
cccccc 2.0'''

re.sub(pattern=r'0(?=.)', string=s, repl='x')

Out[743]: '\n    aaaaaaaxaaa\n    bbbbbbbxbbbbbb\n    cccccc 2.0'
1 голос
/ 23 мая 2019

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

(.+[a-z])([0-9]+)([a-z].+) 

DEMO

enter image description here

RegEx

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

RegEx Circuit

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

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])([0-9]+)([a-z].+)"

test_str = ("aaaaaaa0aaa\n"
    "bbbbbbb0bbbbbb\n"
    "cccccc 2.0")

subst = "\\1x\\3"

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

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])([0-9]+)([a-z].+)/gm;
const str = `aaaaaaa0aaa
bbbbbbb0bbbbbb
cccccc 2.0`;
const subst = `$1x$3`;

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

console.log('Substitution result: ', result);
0 голосов
/ 23 мая 2019

Просто сопоставьте что-либо после 0: 0(.) и замените на x$1

. Он будет соответствовать нулю только в том случае, если после него будет символ, и заменит его на "x" и этот символ..

См. regex101 решение

0 голосов
/ 23 мая 2019

Зависит от того, насколько жадным ты хочешь быть.Чем строже, тем лучше, но что-то вроде этого [a-zA-Z](0)[a-zA-Z] работает нормально, если вы всегда хотите нацелиться на 0, и оно будет явно окружено альфа-символом (a-zA-Z).

Вы можете поигратьс этим и посмотрите, как это работает здесь: https://regex101.com/r/0UYSvp/1

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