二百块做网站,免费建站自助建站,工程信息造价,房产这么做网站才多点击量数据识别场景
数据识别确实可以分为两种主要类型#xff1a;直接识别和间接识别#xff08;或称为从文本中发现#xff09;。下面我将详细解释这两种类型#xff1a; 直接识别#xff1a; 定义#xff1a;直接识别是指直接判断某个数据是否符合特定的标准或条件。应用场…数据识别场景
数据识别确实可以分为两种主要类型直接识别和间接识别或称为从文本中发现。下面我将详细解释这两种类型 直接识别 定义直接识别是指直接判断某个数据是否符合特定的标准或条件。应用场景例如判断一个数字是否是偶数或者判断一个字符串是否是有效的电子邮件地址。方法通常使用规则或算法直接对数据进行检查如使用正则表达式来验证电子邮件地址的格式。 间接识别从文本中发现 定义间接识别是指从一段文本中提取出符合特定条件的数据。应用场景例如从一篇新闻文章中提取出所有的日期或者从社交媒体帖子中识别出所有的地理位置信息。方法通常涉及自然语言处理NLP技术如命名实体识别NER、关键词提取等。这些技术可以帮助从文本中识别和提取出特定的数据类型。
这两种方法在实际应用中常常结合使用以提高数据识别的准确性和效率。例如在处理大量文本数据时可以先使用间接识别方法提取出潜在的相关数据然后再使用直接识别方法对这些数据进行进一步的验证和分类。 直接识别和间接识别在代码处理方式上有所不同以python代码识别email为例:
对于直接识别正则表达式可以用 ^$ 限定正则的边界保证正则表达式是完全匹配而不是匹配一部分同时判断逻辑使用 re.match(PATTERN, TARGET) is not None
import redef is_valid_email(email):pattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$return re.match(pattern, email) is not None# 示例
email exampleexample.com
print(is_valid_email(email)) # 输出: True对于间接识别正则表达式不能使用^$同时判断逻辑使用re.findall(PATTERN, TARGET) 返回所有匹配的结果
import redef extract_emails(text):pattern r[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}return re.findall(pattern, text)# 示例
text Contact us at exampleexample.com or supportexample.com
print(extract_emails(text)) # 输出: [exampleexample.com, supportexample.com]奇技淫巧
1. 限定识别对象的边界
例如我要查找一个6位数号码而实际数据中有超过6位数的号码如果处理不当会把长串数字中的6为子串提取出来这显然是不对的。
def extract_bank_cards(text):pattern \d{6}return re.findall(pattern, text)# 示例
text Bank cards: 123456, 1234567890123456, 1234567890123457
print(extract_bank_cards(text)) # 输出: [123456, 123456, 789012, 123456, 789012]如何避免呢使用正则的负向断言
这个正则表达式 (?!\d)\d{6}(?!\d) 的含义是匹配一个六位数字并且这个六位数字的前后都不能紧跟着其他数字。
让我们分解这个正则表达式
(?!\d) 是一个负向前瞻断言negative lookbehind assertion表示在当前位置之前不能有数字。\d{6} 匹配六个连续的数字。(?!\d) 是一个负向后瞻断言negative lookahead assertion表示在当前位置之后不能有数字。
假设我们有以下文本
123456 7890123 1234567 123456使用正则表达式 (?!\d)\d{6}(?!\d) 进行匹配
import retext 123456 7890123 1234567 123456
pattern r(?!\d)\d{6}(?!\d)
matches re.findall(pattern, text)
print(matches) # 输出: [123456, 123456]在这个例子中正则表达式匹配了两个 “123456”因为它们的前后都没有紧跟着其他数字。而 “7890123” 和 “1234567” 没有被匹配因为它们的前后都有其他数字。
注意
负向前瞻和负向后瞻断言不消耗字符它们只检查特定条件是否满足。这个正则表达式适用于匹配独立的六位数字而不包括其他数字。
通过使用这种正则表达式可以精确地匹配特定格式的数字避免匹配到不符合条件的数字序列。
2. 非捕获组
当写了一个非常复杂的正则表达式里面用括号定义了很多捕获组(capturing group)直接使用findall可能捕获返回期望的结果。
import redef extract_url(text):pattern https?://([\da-zA-Z_\.])(:\d)?((/[a-zA-Z\d\.]))?return re.findall(pattern, text)# 示例
text url地址为http://www.baidu.com:9090/hello/kugou
print(extract_url(text)) # 输出: [(www.baidu.com, :9090, /hello/kugou, /kugou)]此时你需要将正则中的捕获组改成非捕获组即把(...) 改写成 (?:...)
import redef extract_url(text):pattern rhttps?://(?:[\da-zA-Z_\.])(?::\d)?(?:(?:/[a-zA-Z\d\.]))?return re.findall(pattern, text)# 示例
text url地址为http://www.baidu.com:9090/hello/kugou
print(extract_url(text)) # 输出: [http://www.baidu.com:9090/hello/kugou]