5

我是 Python 中正则表达式的新手:
我有一个列表,如果它包含员工姓名,我想搜索它。

员工姓名可以是:

  • 它可以在开头,后跟空格。
  • 其次是 ®
  • OR 后跟空格
  • 或 可以在末尾和之前的空格
  • 不区分大小写

ListSentence = ["Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel"]
ListEmployee = ["Steve", "Rob", "daniel"]

的输出ListSentence是:

["Steve®", "Rob spring", "Car Daniel", "Done daniel"]
4

5 回答 5

6

首先获取您所有的员工姓名,并用一个|字符将它们连接起来,然后将字符串包装起来,如下所示:

(?:^|\s)((?:Steve|Rob|Daniel)(?:®)?)(?=\s|$) 在此处输入图像描述

通过首先将所有名称连接在一起,您可以避免使用嵌套的 for next 循环集的性能开销。

我不太了解python,无法提供python示例,但是在powershell中我会这样写

[array]$names = @("Steve", "Rob", "daniel")
[array]$ListSentence = @("Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel")

# build the regex, and insert the names as a "|" delimited string
$Regex = "(?:^|\s)((?:" + $($names -join "|") + ")(?:®)?)(?=\s|$)" 

# use case insensitive match to find any matching array values
$ListSentence -imatch $Regex

产量

Steve®
Rob spring
Car Daniel
Done daniel
于 2013-06-17T04:10:09.400 回答
3

为什么要使用正则表达式?我通常建议在 Python 中避免使用它们——你可以使用字符串方法。

例如:

def string_has_employee_name_in_it(test_string):
    test_string = test_string.lower() # case insensitive
    for name in ListEmployee:
        name = name.lower()
        if name == test_string:
            return True
        elif name + '®' == test_string:
            return True
        elif test_string.endswith(' ' + name):
            return True
        elif test_string.startswith(name + ' '):
            return True
        elif (' ' + name + ' ') in test_string:
            return True
    return False   

final_list = []
for string in ListSentence:
    if string_has_employee_name_in_it(string):
        final_list.append(string)

final_list 是您想要的列表。这比正则表达式更长,但也更容易解析和维护。您可以通过各种方式使其更短(例如在函数中组合测试,并使用列表推导而不是循环),但是当您开始使用 Python 时,最好弄清楚发生了什么.

于 2013-06-17T04:17:48.890 回答
2

如果您只是在寻找包含空格的字符串,如您的示例所示,它应该是这样的:

[i for i in ListSentence if i.endswith('®') or (' ' in i)]
于 2013-06-17T04:09:33.480 回答
2

我认为您不需要检查所有这些情况。我认为您需要做的就是检查断字。

您可以加入 ListEmployee 列表|以创建一个或正则表达式(也将其小写以不区分大小写),并由\bfor 分词包围,这应该有效:

regex = '|'.join(ListEmployee).lower()
import re
[l for l in ListSentence if re.search(r'\b(%s)\b' % regex, l.lower())]

应该输出:

['Steve\xb6\xa9', 'Rob spring', 'Car Daniel', 'Done daniel']
于 2013-06-17T04:19:44.810 回答
1

一个可能的解决方案:

import re

ListSentence = ["Steve®", "steveHotel", "Rob spring", "Car Daniel", "CarDaniel","Done daniel"]
ListEmployee = ["Steve", "Rob", "daniel"]


def findEmployees(employees, sentence):
    retval = []
    for employee in employees:
        expr = re.compile(r'(^%(employee)s(®)?(\s|$))|((^|\s)%(employee)s(®)?(\s|$))|((^|\s)%(employee)s(®)?$)' 
            % {'employee': employee}, 
          re.IGNORECASE)
        for part in sentence:
            if expr.search(part):
                retval.append(part)
    return retval



findEmployees(ListEmployee, ListSentence)

>> Returns ['Steve\xc3\x82\xc2\xae', 'Rob spring', 'Car Daniel', 'Done daniel']
于 2013-06-17T04:31:30.277 回答