在字符串

时间:2019-02-16 19:29:07

标签: python arrays regex indexof

我是python的新手,它试图熟悉正则表达式和字符串处理。我写了一个正则表达式,通过它可以识别整个字符串中的数字并将其提取到数组中。

我想要一个包含找到的词的位置的并行数组。

为澄清起见,假设主字符串为:

text = '11 scholars are selected to comptete on Feb 20 , 2019. 
Afterwards, 11 professors will review their submitted work. 
The results will be announced on Mar 20 , 2019.'

正如我所说,我可以从上面的字符串中匹配nums = ['11', '20', '2019', '11', '20', '2019']。现在,我想形成一个同步数组,用于存储每个数字的位置。我正在使用以下代码段:

positions = []
for num in nums:
   pos = text.find(num)
   positions.append(num + ' : ' + str(pos))

positions数组包含:positions = ['11 : 0', '20 : 44', '2019 : 49', '11 : 0', '20 : 44', '2019 : 49']显然不是我想要的。由于列表中存在重复的数字(例如两个11或12),因此text.find(num)返回该术语的首次出现。因此,当程序到达令牌的下一个匹配项时,它将返回第一个匹配项的位置。

关于如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用finditer来返回产生匹配对象的迭代器,并可以从这些匹配中获取匹配的字符串和起始位置:

import re

text = """11 scholars are selected to comptete on Feb 20 , 2019. 
Afterwards, 11 professors will review their submitted work. 
The results will be announced on Mar 20 , 2019."""

[(m.group(0), m.start()) for m in re.finditer(r'\d+', text)]
# [('11', 0), ('20', 44), ('2019', 49), ('11', 68), ('20', 154), ('2019', 159)]

或者,如果您希望其格式符合您的问题,则:

['{}: {}'.format(m.group(0), m.start()) for m in re.finditer(r'\d+', text)]
# ['11: 0', '20: 44', '2019: 49', '11: 68', '20: 154', '2019: 159']

答案 1 :(得分:1)

@Thierry的方法肯定是pythonic的,并充分利用了正则表达式。一种更简单的方法如下:

example_data %>%
        pull(list_col) %>%
        map(. , ~{setNames(.x, my_new_column_names)}) %>%
        map(., ~{.x %>% t %>% as.tibble}) %>%
        bind_rows() %>%
        bind_cols(example_data, .) %>%
        select(-list_col)