Skip to main content
 首页 » 编程设计

Python 正则表达式之模式匹配

2025年05月04日26webabcd

这是我第一次使用正则表达式进行模式匹配,所以 任何帮助表示赞赏。

我正在尝试在字符串中搜索以下子字符串:

"(TPU 1-999) 
http://somewebaddress.com" 

我想将 TPU、1-999 和链接保留为单独的子字符串。

这是我正在使用的模式:

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}.\d{2,5})\)$^\s{3}(http+\s{1,100})$ 

我会分解它来解释我的推理

^\s{3} - 字符串(或本例中的行)的开头,后跟 3 个空格

\( - 左括号

([AEINPRSTUW]{3}) - 括号中任何字母的 3 个实例,TPU 就是一个示例

\s(\d{1,3}.\d{2,5}) - 一个空格,然后是 1-3 个数字,由 2-5 个数字中的任何字符分隔数字

\)$ - 右括号,行尾

^\s{3} - 下一行的开头后跟三个空格

(http+\s{1,100})$ - 字符“http”后跟 1 到 100 个非空白字符之间的任意位置,以及行尾。

这种模式现在不起作用,但我正朝着正确的方向前进吗?

请您参考如下方法:

$^ 这行不通。 $是行尾(换行前),^是行首(换行后)。但是换行符是一个(或两个)字符,同时不推进正则表达式引擎的位置。所以 $ 和 ^ 尝试匹配相同的位置,这只有在它们是空行的结尾和开头时才会发生 - 甚至将它们按此顺序排列会产生很大的误导。如果你想确保它们之间只有一个换行符,试试这个:

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}.\d{2,5})\)$(\r\n?|\n)^\s{3}(http+\S{1,100})$ 

但是,正如 ridgerunner 在评论中指出的那样,以下 \s{3} 可以匹配(最多 3 个)更多换行符,因为它们也是空白。

另请注意,. 作为数字的分隔符可能不是最好的主意。至少,使用非数字字符:

^\s{3}\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)$(\r\n?|\n)^\s{3}(http+\S{1,100})$ 

另请注意,我已将您的最后一个 \s 更改为 \S(因为 \s 是空格,\S 是非空白)。

另请注意,您向我们展示的字符串不包含您尝试匹配的那三个空格。因此,让它们成为可选的(正如 CaptainMurphy 所建议的那样)可能也会有所帮助:

^\s*\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)$(\r\n?|\n)^\s*(http+\S{1,100})$ 

并且由于我们已经匹配了那个换行符,我们也可以完全删除那里的那些 anchor ,它们不再真正有帮助了:

^\s*\(([AEINPRSTUW]{3})\s(\d{1,3}\D\d{2,5})\)(\r\n?|\n)\s*(http+\S{1,100})$