这是我第一次使用正则表达式进行模式匹配,所以 任何帮助表示赞赏。
我正在尝试在字符串中搜索以下子字符串:
"(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})$
关于Python 正则表达式 - 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13072042/