Python 正则表达式 - 模式匹配

标签 python regex python-2.7

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

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

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

我想将 TPU1-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})$

关于Python 正则表达式 - 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13072042/

相关文章:

php - 清理货币字符串的快速方法

python - win32com DLL 加载失败

python - while 循环删除数据存储中的数据

python - 如何仅将 'Unnamed:' 列重命名为数字索引

javascript - 从字符串中提取数字值

python - 如何在 python pandas 中使用两个列值创建 url 列数据框?

python - Six.u() 取消转义 HTML 字符串

python - 库达 API 错误 : [1] Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE in Python

Python(名称 "command"未定义)

用于匹配 anchor 否定和字符串的正则表达式