Regex代码,用于识别关键字,后跟复杂模式(来自可变的人工输入)

n7taea2i  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在处理一个NLP项目,其中的数据需要对PII进行清理。我使用spaCy NER处理了日期和名称,但我需要查找后跟字母数字的(不区分大小写)Room的示例。我有个东西能用,但太丑了。我从一个同事那里继承了一个模式,但他们的模式错过了很多模式,并且会抓住The room was...和miss room 16b/16a/16c这样的东西。我在python 3.X环境下工作。
我正在努力学习,并尽我所能使用regex101。虽然此模式主要用于查找room之后的字母数字模式,但它会抓取room之后的任何单词,这是不希望出现的。The room was cleaned变为The room number cleaned。我认为\w?是不期望的原因。我在?\w? ?之后添加了这个模式,但我认为它并不高效,也不容易理解到底发生了什么。
我的模式

(room|rm) ?(#|number|no.?)? ?\w? ?(\d+|[a-z0-9\-?\/\(\) ]{2,5})[a-z]?| (room?) ([0-9]+[a-z/]+)+| room? [a-z]?[0-9/]+

字符串
和示例

room (b7)
rm 2
rm no 4
room a12
Room 12
Roomd25
room D25
ROOM D25
ROOM C-11
room 17
room A4B
room 101
rm #17 
room 37/39
ROOM B-1
room C 29 from 
room C23/25/27
room 16b/18a/18b
Clean the room now _AVOID_

pb3skfrl

pb3skfrl1#

正则表达式对于自定义的人工输入来说可能很难看,因为我们是人类,我们输入的东西不同。如果可能,请在存储数据之前尝试清理数据。
可能会使所有内容都小写,将rm替换为room。删除字符串中的任何非字母字符。在使用regex之前,我肯定会这样做。

import re

def clean_data(text):
    text = text.lower()
    text = text.replace("rm", "room")
    return re.sub(r'[^a-zA-Z0-9 ]', '', text)

pattern = r'\b(room|rm)\b\s*([#]?|number|no.?|[\w/()]*\w)\s*([a-zA-Z0-9-]+)\b'

text = ['room b7', 'rm 2', 'not a room fsd', 'rm no 4', 'room a12', 'Room 12', 'Roomd25', 'room D25', 'ROOM D25', 'ROOM C11', 'room 17', 'room A4B', 'room 101', 'rm 17', 'room 37/39', 'ROOM B1', 'room C 29 from', 'room C23/25/27', 'room 16b/18a/18b', 'and other sentences that should be left intact like Clean the room now AVOID.']

ny_text = [clean_data(t) for t in text]

for t in ny_text:
    match = re.findall(pattern, t, re.IGNORECASE)
    if not match:
        continue
    room_alias = match[0][0]
    room_number = match[0][2]
    print(f"Found: {room_alias} {room_number}")

字符串

相关问题