简体   繁体   中英

Regex: Match everything between dots, but exclude entire word if parenthesis is found

I'm currently trying to find a regex pattern that allows me to match dot separated words past config. , but not match any words that have open parenthesis. Example:

  • config.hello.world should match hello.world
  • config.hello should match hello
  • config.hello.world( should match hello
  • config.hello.world*10 should match hello.world

I've been unable to figure out the parenthesis part. The first, second, and fourth example above I've gotten to work via

\bconfig\.([\w\.]+)

Any help would be appreciated, thank you.

You can use

\bconfig\.([\w.]+)\b(?![(\w])

See the regex demo . Details :

  • \b - a word boundary
  • config\. - a config. substring
  • ([\w.]+) - Group 1: one or more word or . chars
  • \b - a word boundary
  • (?![(\w]) - a negative lookahead that fails the match if there is a word or ( char immediately to the right of the current location.

See the Python demo :

import re
texts = ['config.hello.world','config.hello','config.hello','config.hello.world']
rx = re.compile(r'\bconfig\.([\w.]+)(?![(\w])')
for text in texts:
    m = rx.search(text)
    if m:
        print(text + " => " + m.group(1))
    else:
        print(text + " => NO MATCH")

Output:

config.hello.world => hello.world
config.hello => hello
config.hello => hello
config.hello.world => hello.world

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