我需要帮助。 我有一个列表和字符串。
我想要做的是找到字符串中的所有数字,并且还匹配字符串中除了数字之外的列表中的单词。
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
旁边。
答案 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位数)。
第二次更改(?:No\. (\d+))
- 为您提供前缀为文字“编号”的编号(注意末尾的空格),然后捕获以下编号,无论多长时间(至少一位数)
第三部分和最后一部分(\d+\w{2})
- 只捕获任意数量的数字(同样,至少一个),后跟两个单词字符。您可以进一步改进正则表达式的这一部分,以仅匹配st
,nd
和th
后缀,但我会将留给您。
另外,为了摆脱进一步不必要的匹配,你可以使用外观,但是再一次 - 我会将留给你来实现。
一般说明 - 而不是使用一个正则表达式来规则... erm - 将它们全部匹配,您应该专注于创建许多简单的正则表达式。这不仅可以提高可读性,还可以提高正则表达式的可维护性。这也允许您搜索时间戳,建筑物编号和位置数字单独,轻松地将此信息拆分为特定变量。