Python:这个示例中用于文本解析的一个很好的正则表达式

2024-10-04 11:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有些单词有发音。不管怎样,我只想提取第一个词

A  AH0
A'S  EY1 Z
A(2)  EY1
A.  EY1
A.'S  EY1 Z
A.S  EY1 Z
A42128  EY1 F AO1 R T UW1 W AH1 N T UW1 EY1 T
AAA  T R IH2 P AH0 L EY1
AABERG  AA1 B ER0 G
AACHEN  AA1 K AH0 N
AAKER  AA1 K ER0
AALSETH  AA1 L S EH0 TH
AAMODT  AA1 M AH0 T
AANCOR  AA1 N K AO2 R
AARDEMA  AA0 R D EH1 M AH0

我试过regex= r"(\A[A-Z]+\b) | (\A[A-Z\'w]+\b)"

\A:只在字符串开头匹配。在

^{pr2}$

\b:再次从http://docs.python.org/2/library/re.html开始,我认为这就像是一个边界b/w字母数字和非字母数字。在

What is happening is these are being collected:
('A', ' ')
('A', ' ', 'B', 'E', 'G', 'R') is actually AABERG
('A', ' ', 'C', 'E', 'H', 'N') AACHEN
('A', ' ', 'C', 'O', 'N', 'R')
('A', ' ', 'D', 'M', 'O', 'T')
('A', ' ', 'E', 'D', 'M', 'R')
('A', ' ', 'E', 'H', 'L', 'S', 'T')  
('A', ' ', 'K', 'R', 'E') AAKER

我以元组列表的形式收集它们(一个单词作为元组中的单个字母) 这就是我要做的。问题是,我发现当重复字母A在这里重复不止一次时:“A”没有被包括进来,而是A 添加“”空空白。发生什么事了?我只想在这里提取第一个起始词,not A(2) or whitespaces or (,),[,] or any other symbolic character except for "'\'"这就是为什么我想添加[A-Z'w]

如果有人能告诉我如何添加多个条件

regex= r"(\A[A-Z]+\b) | (\A[A-Z\'w]+\b) | ^\A[A-Z]+\b"这能^\A[A-Z]+\b“在提取或^\A[A-Z]+\s”这更好吗?我很困惑。在

更新

如果我也想要

;Semi-colon
A.S
.Dot

r'[^\SA-Z\\]+能起作用吗?这'\\'取自Inbar-Rose的下面的溶液。还在想那是怎么回事


Tags: oris字母数字单词regex元组aachen
3条回答

如果你想要的只是文本每行的第一个单词,你甚至不需要正则表达式:

for line in text.split('\n'):
    first_word = line.split()[0]

但是如果您坚持使用正则表达式(这也将确保您只获取字母(A-Z)和{}):

^{pr2}$

注意,这假设text是一个带换行符(新行)的字符串如果您实际上是从文件或其他源读取的,则迭代将不同。在

我不是百分之百地了解你期望的输出结果,但这里有一个尝试:

#!/usr/bin/env python
import re

pattern = r"^([A-Za-z]+)"

text = """A  AH0
A'S  EY1 Z
A(2)  EY1
A.  EY1
A.'S  EY1 Z
A.S  EY1 Z
A42128  EY1 F AO1 R T UW1 W AH1 N T UW1 EY1 T
AAA  T R IH2 P AH0 L EY1
AABERG  AA1 B ER0 G
AACHEN  AA1 K AH0 N
AAKER  AA1 K ER0
AALSETH  AA1 L S EH0 TH
AAMODT  AA1 M AH0 T
AANCOR  AA1 N K AO2 R
AARDEMA  AA0 R D EH1 M AH0"""

def main():
    print re.findall(pattern, text, re.MULTILINE)

if __name__ == '__main__':
    main()

结果是:

^{pr2}$

如果你的问题变得更复杂,我们可以对这个答案做些小的改动。假设您需要不同的行分隔符,而不仅仅是\n。以下模式将不使用MULTILINE,但将生成与之前相同的输出。在第一个集合中,您可以添加其他可以匹配的字符,例如;。在

pattern = r"[\n^]([A-Za-z]+)"
print re.findall(pattern, text)

你为什么需要一个正则表达式?在

with open('data.txt') as f:
     lines = list(f)
print [l.split()[0] for l in lines

Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.

相关问题 更多 >