如何匹配这样的字符串:
firstword [foo = bar]
和
firstword
使用1个正则表达式。
我尝试过的是(\w+)[\s]{0,1}\[(.+)\]
,我只能匹配第一个,我还尝试将最后一个\[(.+)\]
与[]*
包装到[\[(.+)\]]*
现在我无法在方括号内匹配空格和'='。
你们可以提一下吗?
答案 0 :(得分:3)
似乎最后一部分只是可选的:
(\w+)\s?(?:\[([^\]]+)\])?
(?: ... )?
是一个可选部分,不执行内存捕获。
如果可选部分也意味着总是有空格,您也可以移动\s
内部:
(\w+)(?:\s\[([^\]]+)\])?
答案 1 :(得分:0)
(\w+)\s*(\[.+?\])?
在Python交互式shell中测试:
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword [foo = bar]').groups()
('firstword', '[foo = bar]')
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword [foo = bar').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword foo = bar').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword foo = bar]').groups()
('firstword', None)
>>> re.match(r'(\w+)\s*(\[.+?\])?', 'firstword').groups()
('firstword', None)
答案 2 :(得分:0)
您可以使用非qreedy量词。在Perl扩展表示法中:
s/ ^ # Beginning of string. You might not need this.
(\w+) # Capture a word.
\s* # Optional spaces.
(?: # Non-capturing group.
\[ # Literal bracket.
.*? # Any number of characters, but as few as possible,
# so stopping before:
\] # Literal bracket
)? # End the group, and make it optional as requested.
/
$1 # The captured word.
/x # Allow the extended notation.
根据需要修改此项。有些引擎使用\1
代替$1
。