【问题标题】:Match zero or more occurrence of string Regex匹配零次或多次出现的字符串正则表达式
【发布时间】:2018-06-18 09:30:41
【问题描述】:

我正在尝试匹配一些模式,请参考 online tool 以便于测试

pattern = r"(^/\w+)\s*?(\w+)"
string_1 = "/path_one path_two"
string_2 = "/path_one_only"

虽然 string_1 通过返回两个部分按预期匹配,但对于 string_2,它会删除第一个部分的最后一个字符。但我希望模式始终返回两个部分,而不是在路径二不存在时返回 None/空字符串

【问题讨论】:

  • + 表示一个或更多。所以为了匹配正则表达式,它必须至少捕获一个字符。

标签: python regex


【解决方案1】:

使用这种模式:

pattern = r"(^/\w+)\s*(\w*)"

现在第二个字符串将在第一个捕获组中完全匹配。

最后一个字符在第二个字符串中被剪切的原因可以在这里看到:

(^/\w+)  - matches 'path_one_onl'
\s*?     - matches nothing (there are no spaces)
(\w+)    - matches 'y'

换句话说,第二个捕获组强制要求至少匹配一个字符。

【讨论】:

  • 感谢您的解释
  • @Paullo 很高兴为您提供帮助 :-)
【解决方案2】:

将您的模式字符串更改为

  1. 要么

    pattern = r"(^/\w+)\s*(\w+)?"
    
  2. pattern = r"(^/\w+)\s*(\w*)"
    

你不需要\s*?,只要\s*就可以了。

【讨论】:

  • 谢谢@hjpotter,两个答案都是正确的。我接受蒂姆的回答,因为它是第一位的,并且添加了更多细节。
【解决方案3】:

您还可以通过在其周围添加一个非捕获组来使整个第二部分(包括空格)成为可选:

r"(^/\w+)(?:\s+(\w+))?"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多