Oliver Farren
Oliver Farren

Reputation: 615

Regular expression for matching non-whitespace in Python

I want to use re.search to extract the first set of non-whitespace characters. I have the following pseudoscript that recreates my problem:

#!/usr/bin/env python2.7
import re

line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('^[^\S]*?',line)
if m:
    print m.group(0)

It seems to be printing the whitespace instead of STARC-1.1.1.5

So far as I understand it, this regular expression is saying: At the start of the line, find a set of nonwhitespace characters, don't be greedy

I was pretty sure this would work, the documentation says I can use /S to match whitespace in [], so i'm not sure where the issue is.

Now, I know, I know this probably looks weird, why aren't I using some other function to do this? Well, there's more than one way to skin a cat and i'm still getting the hang of regular expressions in Python so I'd like to know how I can use re.search to extract this field in this fashion.

Upvotes: 13

Views: 37518

Answers (4)

NEO MED
NEO MED

Reputation: 21

Replace your re.search as below, \S finds non-whitespace character, and + searches for one or more times. Python starts to search from first character.

import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('\S+',line)
print(m.group(0))

Upvotes: 0

NEO MED
NEO MED

Reputation: 21

import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('S.+[0-9]',line)
print(m.group(0))

The re.search returns the match, so use the alphabets and numbers and print the match as mentioned in the code. If you print only the variable it prints it as match 1. Hope this answers your question

m = re.search('[A-Z].+[0-9]',line)

Changing the re.search to the capital letters will find from CAPS A to Z, vice vers if you change it to small letters as

m = re.search('[a-z].+[0-9]',line)

it will find only small letters, sometimes you should highlight the symbols too, to search from it or to search upto the characters before that symbol.

Upvotes: 0

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626758

The [^\S] is a negated character class that is equal to \s (whitespace pattern). The *? is a lazy quantifier that matches zero or more characters, but as few as possible, and when used at the end of the pattern never actually matches any characters.

Replace you m = re.search('^[^\S]*?',line) line with

m = re.match(r'\S+',line)

or - if you want to also allow an empty string match:

m = re.match(r'\S*',line)

The re.match method anchors the pattern at the start of the string. With re.search, you need to keep the ^ anchor at the start of the pattern:

m = re.search(r'^\S+',line)

See the Python demo:

import re
line = "STARC-1.1.1.5             ConsCase    WARNING    Warning"
m = re.search('^\S+',line)
if m:
    print m.group(0)
# => STARC-1.1.1.5

However, here, in this case, you may just use a mere split():

res = line.split() 
print(res[0])

See another Python demo.

Upvotes: 18

melpomene
melpomene

Reputation: 85767

\s matches a whitespace character.

\S matches a non-whitespace character.

[...] matches a character in the set ....

[^...] matches a character not in the set ....

[^\S] matches a character that is not a non-whitespace character, i.e. it matches a whitespace character.

Upvotes: 8

Related Questions