简体   繁体   中英

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"

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

This regex should work:

\d+(\.\d+)?

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

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM