Как использовать регулярное выражение с необязательными символами в python?
Скажем, у меня есть строка
"3434.35353"
и еще одна строка
"3593"
Как создать одно регулярное выражение, которое может совпадать и без меня, чтобы установить шаблон на что-то другое, если другой не удается? Я знаю, что \d+
будет соответствовать 3593
, но он ничего не сделает для 3434.35353
, но (\d+\.\d+
) будет соответствовать только одному с десятичной точкой и не будет возвращать совпадений для 3593
.
Я ожидаю вернуть m.group(1)
:
"3434.35353"
или
"3593"
Ответы
Ответ 1
Вы можете поместить ?
после группы символов, чтобы сделать его необязательным.
Вам нужна точка, за которой следует любое количество цифр \.\d+
, сгруппированные вместе (\.\d+)
, необязательно (\.\d+)?
. Вставьте это в свой шаблон:
import re
print re.match("(\d+(\.\d+)?)", "3434.35353").group(1)
3434.35353
print re.match("(\d+(\.\d+)?)", "3434").group(1)
3434
Ответ 2
Это регулярное выражение должно работать:
\d+(\.\d+)?
Он соответствует одной или нескольким цифрам (\d+
), за которыми следует точка и одна или несколько цифр ((\.\d+)?
).
Ответ 3
Используйте квантор "один или нуль", ?
. Ваше регулярное выражение будет: (\d+(\.\d+)?)
.
Подробнее о доступных доступных кванторах и о том, как их использовать, см. в главе 8 руководства TextWrangler.
Ответ 4
Читайте в библиотеке Python RegEx. Ссылка отвечает на ваш вопрос и объясняет, почему.
Однако, чтобы сопоставить цифру, а затем большее число цифр с необязательным десятичным числом, вы можете использовать
re.compile("(\d+(\.\d+)?)")
В этом примере,? после того, как группа захвата .\d+
указывает, что эта часть является необязательной.
Пример
Ответ 5
использовать (?:<characters>|)
. замените <characters>
строкой, чтобы сделать необязательным. Я протестировал в оболочке Python и получил следующий результат:
>>> s = re.compile('python(?:3|)')
>>> s
re.compile('python(?:3|)')
>>> re.match(s, 'python')
<re.Match object; span=(0, 6), match='python'>
>>> re.match(s, 'python3')
<re.Match object; span=(0, 7), match='python3'>'''