Rolando
Rolando

Reputation: 62596

How to use regex with optional characters in python?

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"

Upvotes: 47

Views: 91549

Answers (5)

Coderkids Official
Coderkids Official

Reputation: 61

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'>```

Upvotes: 5

PenguinCoder
PenguinCoder

Reputation: 4357

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

Upvotes: 1

Igor Korkhov
Igor Korkhov

Reputation: 8558

This regex should work:

\d+(\.\d+)?

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

Upvotes: 5

Li-aung Yip
Li-aung Yip

Reputation: 12486

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.

Upvotes: 2

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

Upvotes: 81

Related Questions