Python正则表达式搜索数字旁边的特定字符串

时间:2017-07-27 07:03:12

标签: python regex

我需要帮助。 我有一个列表和字符串。

我想要做的是找到字符串中的所有数字,并且还匹配字符串中除了数字之外的列表中的单词。

str = 'Lily goes to school everyday at 9:00. Her House is near to her school. 
Lily's address - Flat No. 203, 14th street lol lane, opp to yuta mall, 
washington. Her school name is kids International.'

list = ['school', 'international', 'house', 'flat no']

我写了一个可以拉数字的正则表达式

x = re.findall('([0-9]+[\S]+[0-9]+|[0-9]+)' , str,re.I|re.M)

我想要的输出:

Numbers - ['9:00', '203', '14th'] 

Flat No.203(因为flat no旁边是203
14也在字符串旁边,但我不想要它,因为它不包含在列表中。

但是如何编写正则表达式以使第二个条件满足。那就是搜索 flat no是否在同一正则表达式中203旁边。

1 个答案:

答案 0 :(得分:1)

你去了:

(\d{1,2}:\d{1,2})|(?:No\. (\d+))|(\d+\w{2})

可以在here

找到Regex101.com上的演示

它做什么以及如何运作?

我使用两个管道(|)来收集你想要的不同数量的“类型”:

  • 第一次更改((\d{1,2}:\d{1,2}) - 使用1-2位数后跟冒号和另一组1-2位数来捕获时间(可能只有2位数)。

    < / LI>
  • 第二次更改(?:No\. (\d+)) - 为您提供前缀为文字“编号”的编号(注意末尾的空格),然后捕获以下编号,无论多长时间(至少一位数)

  • 第三部分和最后一部分(\d+\w{2}) - 只捕获任意数量的数字(同样,至少一个),后跟两个单词字符。您可以进一步改进正则表达式的这一部分,以仅匹配stndth后缀,但我会将留给您

另外,为了摆脱进一步不必要的匹配,你可以使用外观,但是再一次 - 我会将留给你来实现。

一般说明 - 而不是使用一个正则表达式来规则... erm - 将它们全部匹配,您应该专注于创建许多简单的正则表达式。这不仅可以提高可读性,还可以提高正则表达式的可维护性。这也允许您搜索时间戳,建筑物编号和位置数字单独,轻松地将此信息拆分为特定变量。