本文目录导读:

模糊规则的实现方法。
基础模糊匹配脚本
Python 版本
import re
from pathlib import Path
def fuzzy_match_content(file_path, patterns, case_sensitive=False):
"""
模糊匹配文件内容
:param file_path: 文件路径
:param patterns: 匹配模式列表
:param case_sensitive: 是否区分大小写
:return: 匹配结果列表
"""
results = []
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
if not case_sensitive:
content = content.lower()
for pattern in patterns:
# 模糊匹配
if not case_sensitive:
search_pattern = pattern.lower()
else:
search_pattern = pattern
# 使用正则表达式进行模糊匹配
matches = re.finditer(search_pattern, content)
for match in matches:
start = max(0, match.start() - 50)
end = min(len(content), match.end() + 50)
results.append({
'pattern': pattern,
'matched_text': match.group(),
'context': content[start:end],
'position': match.start()
})
except Exception as e:
print(f"读取文件错误: {e}")
return results
# 使用示例
if __name__ == "__main__":
patterns = [r'error.*occurred', r'critical\s+failure', r'warning.*\d+']
matches = fuzzy_match_content('log.txt', patterns)
for match in matches:
print(f"模式: {match['pattern']}")
print(f"匹配文本: {match['matched_text']}")
print(f"上下文: ...{match['context']}...")
print("-" * 50)
Shell 脚本实现
#!/bin/bash
# 模糊匹配文件内容
fuzzy_match() {
local file=$1
local pattern=$2
if [[ ! -f "$file" ]]; then
echo "文件不存在: $file"
return 1
fi
# 使用 grep 进行模糊匹配
grep -n -i -E "$pattern" "$file" | while IFS=: read -r line_num line_content; do
echo "行号: $line_num"
echo "内容: $line_content"
echo "---"
done
}
# 批量匹配
batch_fuzzy_match() {
local file=$1
shift
local patterns=("$@")
for pattern in "${patterns[@]}"; do
echo "匹配模式: $pattern"
fuzzy_match "$file" "$pattern"
echo "===================="
done
}
# 使用示例
batch_fuzzy_match "system.log" "error.*timeout" "failed.*connection" "critical"
高级模糊匹配 - 相似度计算
import difflib
import re
from typing import List, Tuple
class FuzzyMatcher:
def __init__(self, threshold=0.8):
self.threshold = threshold
def calculate_similarity(self, text1: str, text2: str) -> float:
"""计算文本相似度"""
return difflib.SequenceMatcher(None, text1, text2).ratio()
def fuzzy_search(self, content: str, pattern: str) -> List[Tuple[str, float]]:
"""模糊搜索相似文本"""
results = []
lines = content.split('\n')
for line in lines:
similarity = self.calculate_similarity(line, pattern)
if similarity >= self.threshold:
results.append((line, similarity))
# 按相似度排序
results.sort(key=lambda x: x[1], reverse=True)
return results
def regex_fuzzy_match(self, content: str, patterns: List[str]) -> List[dict]:
"""正则模糊匹配"""
results = []
for pattern in patterns:
# 构建模糊正则表达式
fuzzy_pattern = self._build_fuzzy_regex(pattern)
matches = re.finditer(fuzzy_pattern, content)
for match in matches:
results.append({
'original_pattern': pattern,
'matched': match.group(),
'position': match.span()
})
return results
def _build_fuzzy_regex(self, pattern: str) -> str:
"""构建模糊正则表达式"""
# 允许字符间的缺失、插入和替换
fuzzy_parts = []
for char in pattern:
if char.isalnum():
fuzzy_parts.append(f'{char}.{{0,2}}')
else:
fuzzy_parts.append(re.escape(char))
return ''.join(fuzzy_parts)
# 使用示例
matcher = FuzzyMatcher(threshold=0.7)
content = "系统错误:连接超时,请重试"
pattern = "系统错误:连接失败"
results = matcher.fuzzy_search(content, pattern)
for text, similarity in results:
print(f"相似度: {similarity:.2f} - {text}")
粗糙规则匹配器
class RoughRuleMatcher:
"""粗糙规则匹配器"""
def __init__(self):
self.rules = []
def add_rule(self, name: str, keywords: List[str],
min_match: int = 1, operator: str = 'or'):
"""
添加匹配规则
:param name: 规则名称
:param keywords: 关键词列表
:param min_match: 最小匹配数
:param operator: 逻辑运算符 ('or', 'and')
"""
self.rules.append({
'name': name,
'keywords': keywords,
'min_match': min_match,
'operator': operator
})
def match_content(self, content: str) -> List[dict]:
"""匹配内容"""
results = []
content_lower = content.lower()
for rule in self.rules:
matched_keywords = []
for keyword in rule['keywords']:
if keyword.lower() in content_lower:
matched_keywords.append(keyword)
# 判断是否满足规则
if rule['operator'] == 'or':
if len(matched_keywords) >= rule['min_match']:
results.append({
'rule_name': rule['name'],
'matched_keywords': matched_keywords,
'match_count': len(matched_keywords)
})
elif rule['operator'] == 'and':
if len(matched_keywords) >= len(rule['keywords']):
results.append({
'rule_name': rule['name'],
'matched_keywords': matched_keywords,
'match_count': len(matched_keywords)
})
return results
# 使用示例
matcher = RoughRuleMatcher()
# 添加规则
matcher.add_rule(
'错误检测',
keywords=['error', 'failed', 'exception', 'timeout'],
min_match=2,
operator='or'
)
matcher.add_rule(
'安全威胁',
keywords=['attack', 'malware', 'unauthorized', 'breach'],
min_match=1,
operator='or'
)
# 匹配文件
content = "系统发生错误:连接超时,攻击检测到"
results = matcher.match_content(content)
for result in results:
print(f"规则: {result['rule_name']}")
print(f"匹配关键词: {result['matched_keywords']}")
print(f"匹配数量: {result['match_count']}")
完整文件处理脚本
#!/usr/bin/env python3
import os
import sys
import argparse
from pathlib import Path
import re
from typing import List, Dict, Any
class FileFuzzyMatcher:
"""文件模糊匹配器"""
def __init__(self):
self.patterns = []
self.rules = []
def process_file(self, file_path: str) -> Dict[str, Any]:
"""处理单个文件"""
result = {
'file': file_path,
'matches': [],
'errors': []
}
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 执行模糊匹配
for pattern in self.patterns:
matches = self._fuzzy_match(content, pattern)
result['matches'].extend(matches)
# 执行规则匹配
for rule in self.rules:
rule_matches = self._apply_rule(content, rule)
result['matches'].extend(rule_matches)
except Exception as e:
result['errors'].append(str(e))
return result
def process_directory(self, dir_path: str, extension: str = None) -> List[Dict]:
"""处理目录中的文件"""
results = []
path = Path(dir_path)
for file_path in path.rglob('*'):
if file_path.is_file():
if extension and file_path.suffix != extension:
continue
result = self.process_file(str(file_path))
if result['matches']:
results.append(result)
return results
def add_pattern(self, pattern: str, description: str = ""):
"""添加匹配模式"""
self.patterns.append({
'pattern': re.compile(pattern),
'description': description
})
def add_rule(self, rule: Dict):
"""添加匹配规则"""
self.rules.append(rule)
# 主函数
def main():
parser = argparse.ArgumentParser(description='文件内容模糊匹配工具')
parser.add_argument('path', help='文件或目录路径')
parser.add_argument('-p', '--pattern', action='append',
help='匹配模式(可多次使用)')
parser.add_argument('-e', '--extension', help='文件扩展名过滤')
parser.add_argument('-r', '--recursive', action='store_true',
help='递归处理子目录')
args = parser.parse_args()
matcher = FileFuzzyMatcher()
# 添加默认模式
if args.pattern:
for pattern in args.pattern:
matcher.add_pattern(pattern)
else:
# 默认模式
matcher.add_pattern(r'error|failed|exception|timeout', '错误关键词')
matcher.add_pattern(r'\d{4}-\d{2}-\d{2}', '日期格式')
# 处理文件或目录
if os.path.isfile(args.path):
results = [matcher.process_file(args.path)]
elif os.path.isdir(args.path):
results = matcher.process_directory(args.path, args.extension)
else:
print(f"路径不存在: {args.path}")
sys.exit(1)
# 输出结果
for result in results:
print(f"\n文件: {result['file']}")
if result['matches']:
for match in result['matches']:
print(f" 匹配: {match.get('pattern', match.get('rule_name', ''))}")
print(f" 内容: {match.get('matched_text', match.get('matched_keywords', ''))}")
if result['errors']:
print(f" 错误: {result['errors']}")
if __name__ == "__main__":
main()
使用建议
-
选择合适的匹配策略:
- 简单模糊:使用通配符和正则表达式
- 精确模糊:使用文本相似度算法
- 规则匹配:定义关键词组合规则
-
性能优化:
- 对大文件使用流式读取
- 使用编译后的正则表达式
- 缓存匹配结果
-
错误处理:
- 处理编码问题
- 处理大文件内存溢出
- 处理权限问题
这个实现可以根据你的具体需求进行定制和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播