gpt4 book ai didi

正则表达式 Python 在 ( ) 之间拉动

转载 作者:行者123 更新时间:2023-12-02 19:39:13 27 4
gpt4 key购买 nike

我试图使用正则表达式在Python中的括号之间找到正确的名称和日期,但由于某种原因似乎对我不起作用。虽然我希望这是一个简单的答案,但它却让我困惑不已。谁能提供解决方案吗?

我使用的是Python 3.7。该数据集由从学术文章中提取的文本组成。我想提取总是出现在引用句子末尾的作者姓名和出版日期。我想将其放入一个列表中,然后将其存储在 pandas 数据框中。

一个典型的句子是,

“青少年暴力的相关因素仍处于初步了解状态,并且通常默认为 SES 变量(Sheffield,1998)。”

我试图提取的是(Sheffield,1998)类型的数据。它总是会以这种模式出现。我的预期输出是

[(谢菲尔德,1998)]

我当前的代码是:

import re

test_text = ['Sentence 1 (Author, 2019).',
'Sentence 2 (Another Author, 2020)',
'Sentence 3 (First Author & Second Author, 2018)',
'Sentence 4 (Author, 2019; Another Author, 2020; Fourth Author, 2017)']

test_list = []

for elem in test_text:
test_run = re.findall(r'\((\D+), (\d+)\w*\)', str(elem))

if test_run: #if something was found
test_list.append(test_run)

print(elem) #print out to see what is going on

print(str(test_run), '\n') #print out to see what is going on

print("FULL LIST OF PULL:\n", test_list)

现在,当我运行这个时,正则表达式可以很好地提取前三个句子示例,但不能提取第四个句子示例。

我感谢任何建议或帮助。仍在学习正则表达式和Python(正如我的代码可能显示的那样)。如果有更好的方法来做到这一点而不涉及正则表达式,我愿意学习。

提前谢谢您。

最佳答案

一种方法是使用模式并使用捕获组 ([^()]+) 和匹配除 (< 之外的任何字符的否定字符类) 来提取括号之间的内容)。这是一个有点宽泛的模式:

\(([^()]+)\)

Regex demo

您可以通过指定允许使用字符类和重复组来使其更具体,以更接近数据的格式:

\((\w+(?: [\w&]+)*, \d{4}(?:; \w+(?: [\w&]+)*, \d{4})*)\)
  • \( 匹配 (
  • ( 捕获组 1
    • \w+ 匹配 1 个以上单词字符,
    • (?: [\w&]+)*,\d{4} 重复 0+ 次空格、1+ 个单词字符或 &、空格和4 位数字
    • (?:;\w+(?: [\w&]+)*,\d{4})* 之前重复前面的模式 0 次以上;
  • ) 关闭群组
  • \) 匹配 )

Regex demo

import re

test_text = ['Sentence 1 (Author, 2019).',
'Sentence 2 (Another Author, 2020)',
'Sentence 3 (First Author & Second Author, 2018)',
'Sentence 4 (Author, 2019; Another Author, 2020; Fourth Author, 2017)']

test_list = []
pattern = r'\(([^()]+)\)'

for elem in test_text:
for splitOne in re.search(pattern, elem).group(1).split(";"):
for splitTwo in splitOne.split(":"):
test_list.append(splitTwo.strip())

print("FULL LIST OF PULL:\n", test_list)

输出

FULL LIST OF PULL:
['Author, 2019', 'Another Author, 2020', 'First Author & Second Author, 2018', 'Author, 2019', 'Another Author, 2020', 'Fourth Author, 2017']

或者使用例如 this Python demo 创建列表列表.


另一个选择是使用 PyPi regex module它支持在lookbehind中使用量词。

例如:

(?<=\([^()]*)\w+(?: [\w&]+)*, \d+(?=[^\r\n()]*\))

该模式在左侧断言一个开始 ( ,并在右侧断言结束 ) ,其中匹配单词字符和数字的模式在中间匹配模式。

Regex demo (选择 Javascript 仅用于演示目的)|或者查看Python demo

关于正则表达式 Python 在 ( ) 之间拉动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60532381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com