- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在清理我们的 DNS 区域文件,以便提取仅包含 CNAME
和 A
记录的源域并消除所有注释,TXT
、MX
和 SRV
记录。最重要的是,我想自动化这个过程。
我成功创建了一个正则表达式,可用于在 Sublime Text 中执行查找和替换,并需要进行几次迭代才能达到所需的结果。
让我们以以下示例 DNS 区域文件为例:
$ORIGIN example.com.
@ 3600 SOA ns1.p30.dynect.net. (
zone-admin.dyndns.com. ; address of responsible party
2016072701 ; serial number
86400 IN NS ns1.p30.dynect.net.
3600 IN MX 10 mail.example.com.
60 IN A 204.13.248.106
abc TXT "v=spf1 includespf.dynect.net ~all"
mail IN A 204.13.248.106
vpn IN TXT v=spf1 includespf.dynect.net ~all"
vpn2 IN MX v=spf1 includespf.dynect.net ~all"
webapp IN A 216.146.46.10
#webapp1 IN A 216.146.46.10
xyz IN CNAME example.com.
webapp IN SRV 216.146.46.11
;webapp2 IN A 216.146.46.11
第 1 步
使用它来“查找”
(^;.*)|(^#.*)|(^\$.*)|(^@.*)|(.*IN\h+MX.*)|(.*IN\h+TXT.*)|(.*IN\h+SRV.*)|(.*IN\h+NS.*)|(.*\h+TXT.*)|(\h.+)|(^[\n\r\h]+)
然后什么都不替换。
这将清理区域文件并仅显示指向 CNAME
和 A
记录的源域。
步骤 2
使用以下内容进行“查找”
(.+$)
并将其替换为
\1.example.com
结果是附加了原始域的源域列表:
mail.example.com
webapp.example.com
xyz.example.com
我现在正在尝试编写一个 Python 脚本,为给定的区域文件执行上述操作并将其输出到 .txt
文件。
Wiktor Stribiżew Stack Overflow 上的 RegEx 和 Python 大神帮我写了以下内容:
import re
regex = re.compile(r'^(?:\s+|[;#$@].*)|.*IN\s+(?:MX|TXT|SRV|NS).*|.*\s+TXT.*|\s.+')
with open('1.txt', 'r',encoding='UTF8') as dns:
with open('2.txt', 'w',encoding='UTF8') as output:
for line in dns:
if line.strip():
line = regex.sub('', line.strip())
if line:
output.write("{}.example.com\n".format(line))
不幸的是,脚本的输出是这样的:
zone-admin.dyndns.com..example.com
2016072701.example.com
60.example.com
mail.example.com
webapp.example.com
xyz.example.com
脚本不会省略以空格开头的行。我做错了什么?
最佳答案
看起来您有两个错误,每个错误都会导致错误使用以空格开头的行。
第一个错误出现在语句中
line = regex.sub('', line.strip())
在将行传递给 sub()
方法之前,会去除所有前导空格。因此,正则表达式永远不会看到任何以空格开头的行。
要解决此问题,需要在调用 sub()
方法之后调用 strip()
方法:
line = regex.sub('', line).strip()
请注意,strip()
的全部原因是删除尾随换行符,将 line
设置为要忽略的行的空字符串。可以使用一个简单的测试来检查这一点,因为空字符串是假的。
作为替代方案,可以省略此调用,而是可以修改正则表达式以删除换行符。 (这可以通过将所有“尾随”.*
替换为 [\s\S]*
来完成。)
第二个错误出现在正则表达式中,它只匹配该行的前导空白部分,而不是整个行。这会导致 sub()
方法本质上去除前导空格!
Demo 1 🔗 1
regex = re.compile(r'^(?:\s+|[;#$@].*)|.*IN\s+(?:MX|TXT|SRV|NS).*|.*\s+TXT.*|\s.+')
↑_↑
|
only matches the leading white-space part, not the whole line
快速解决方法是将非捕获组的右括号向前移动:
Demo 2 🔗 1
regex = re.compile(r'^(?:\s+|[;#$@]).*|.*IN\s+(?:MX|TXT|SRV|NS).*|.*\s+TXT.*|\s.+')
↑ ↓
←
请注意,可以通过实现空白元字符 \s
可以在字符类中移动来创建更简单的正则表达式,并且我们只需要检查该行的第一个字符:< br/> Demo 3 🔗 1
regex = re.compile(r'^[\s;#$@].*|.*IN\s+(?:MX|TXT|SRV|NS).*|.*\s+TXT.*|\s.+')
最后,可以通过使用否定前瞻(而不是显式地、详尽地)匹配每个不指向 CNAME 或 A 记录的非注释、非前导空白行来实现进一步的简化。指向非 CNAME/非 A 记录的匹配行:
Demo 4 🔗 1
regex = re.compile(r'^(?:[\s;#$@]|(?!.*IN\s+[AC])).*|\s.+')
或者,如果您更喜欢更少的嵌套(加上它短一个字符;-)):
Demo 5 🔗 1
regex = re.compile(r'^[\s;#$@].*|^(?!.*IN\s+[AC]).*|\s.+')
这是使用上面最后一个正则表达式的代码的完整工作版本:
import re
regex = re.compile(r'^[\s;#$@].*|^(?!.*IN\s+[AC]).*|\s.+')
with open('1.txt', 'r',encoding='UTF8') as dns:
with open('2.txt', 'w',encoding='UTF8') as output:
for line in dns:
if line.strip():
line = regex.sub('', line).strip()
if line:
output.write("{}.example.com\n".format(line))
<小时/>1 所有演示正则表达式都已调整(最后一个空白元字符 \s
已替换为空格)以允许多个行标志用于显示完成替换后的所有结果行(在“替换”框中)。这不会影响正则表达式的功能,因为测试字符串仅包含空格和换行符,没有其他空格。
关于python - 从 DNS 区域文件中提取源域的脚本不会跳过带有前导空格的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697261/
我目前有以下选择语句: SELECT CONCAT(TRUNCATE(HOUR("215:00:36")/24,0),":",HOUR("215:00:36")%24,":",MINUTE("215:
我正在尝试将字符串编码为 base36。 static char *decode(unsigned long long value) { char base36[37] = "01234567
如果我有一个输入字符串,input 有三个或更多小数位,我希望该字符串由单独的 if-loop 处理。 我为此目的创建了以下控制台程序,如果(第一个约束)有小数点 .,则输入 if-loop字符串和(
我有一小段代码,它有一个整数数组,其中包含一些前导 0 的元素。 int arr[]={012,234,071}; cout<
如何从强制范围中删除前导,以便 Some field Any 1 2 3 « 最佳答案 删除 vertical-align: middle 后我觉得不错。 .mandato
我有这个 psd 并试图将它转换为 html css。 但是我无法从psd中计算出css中的行高。 如何根据前导+字体大小计算行高? 谢谢 最佳答案 如果行距不是自动的:LineHeight = fo
有谁知道如何更改文本字段上的行高(行距),最好是在 Interface Builder 中? 我已经找了大约一个小时了,但没有找到。 最佳答案 解决方法如下: Resizing NSTextField
是否可以在 C# 中的单元格元素(行)之间添加空格?我正在 Visual Studio 2012 中创建 pdf,并希望在行之间设置一些空间。我有这样的东西: PdfPTable cellTable
是否可以在 C# 中的单元格(行)元素之间添加空格?我正在 visual studio 2012 中创建一个 pdf,并希望在行之间设置一些空间。我有这样的东西: PdfPTable cellTabl
type ApplyFunc func(commitIndex uint64, cmd []byte) []byte 对于这个声明。我的理解是,这是一个函数指针。它的名字是 ApplyFunc。并且此
我很好奇多列索引的前导列的概念。 我正在使用这个示例 dvdrental分贝。 这是查询: SELECT title, length, rating, replacement_cost
我想将一个 double 格式格式化为最大长度为7的字符串,其中包含一个点“.”以及其后一位数字。 例如: 123.4 becomes "00123.4" 12345 becomes "12345
我需要正则表达式的帮助来从字符串中去除不需要的字符(在 Java 中)。我用 4 个正则表达式解决了这个问题。替换将被多次调用 [peeks: 50+ times/sec] 它并降低性能。但我认为它肯
只是将两个值连接到 mysql 表中的一列。 mysql 表中的第一个值和 PHP 常量中的第二个值保存为 define('ACCOUNTCODESUFFIX','016');。 MySql 查询有点
我如何按此顺序返回这些: 1: aaaa 2: bbbb 3: the cccc 4: dddd 所以忽略开头的“the” 目前我正在使用。 select * from houses order by
我通常使用以下代码将 PHP 变量导入 JavaScript: echo("var zipCode = " . $zipCode . ";"); 这工作正常,但对于以 0 开头的邮政编码,它会被 ch
有什么方法可以用前导 0 和小数来格式化 NSNumber 吗?例如,我需要有能力写 4.5 和 000。目前我有它允许小数,但不允许前导 0。 NSNumberFormatter *f = [[NS
你好我正在以编程方式创建标签栏,在我的功能中需要选择填充自定义颜色的标签,到目前为止我已经使用下面的代码实现了这一点,下面的输出见截图。 tabBarController.tabBar.selecti
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Integer with leading zeroes 有人能告诉我这是怎么回事吗?当我用前导零初始化一个
在 Xcode 6 中,我可以使用编辑器菜单来固定: 引领空间至超视 到 Superview 的尾随空间 顶部空间到Superview Superview的底部空间 我找不到在 Xcode 7 bet
我是一名优秀的程序员,十分优秀!