我是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)
返回该术语的首次出现。因此,当程序到达令牌的下一个匹配项时,它将返回第一个匹配项的位置。
关于如何解决此问题的任何想法?
答案 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)