How to use regex with optional characters in python?

Question:

Say I have a string

"3434.35353"

and another string

"3593"

How do I make a single regular expression that is able to match both without me having to set the pattern to something else if the other fails? I know d+ would match the 3593, but it would not do anything for the 3434.35353, but (d+.d+) would only match the one with the decimal and return no matches found for the 3593.

I expect m.group(1) to return:

"3434.35353"

or

"3593"
Asked By: Rolando

||

Answers:

You can put a ? after a group of characters to make it optional.

You want a dot followed by any number of digits .d+, grouped together (.d+), optionally (.d+)?. Stick that in your pattern:

import re
print re.match("(d+(.d+)?)", "3434.35353").group(1)
3434.35353
print re.match("(d+(.d+)?)", "3434").group(1)
3434
Answered By: Jeremy

Use the “one or zero” quantifier, ?. Your regex becomes: (d+(.d+)?).

See Chapter 8 of the TextWrangler manual for more details about the different quantifiers available, and how to use them.

Answered By: Li-aung Yip

This regex should work:

d+(.d+)?

It matches one ore more digits (d+) optionally followed by a dot and one or more digits ((.d+)?).

Answered By: Igor Korkhov

Read up on the Python RegEx library. The link answers your question and explains why.

However, to match a digit followed by more digits with an optional decimal, you can use

re.compile("(d+(.d+)?)")

In this example, the ? after the .d+ capture group specifies that this portion is optional.

Example

Answered By: PenguinCoder

use (?:<characters>|). replace <characters> with the string to make optional. I tested in python shell and got the following result:

>>> 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'>```
Answered By: Coderkids Official
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.