捕获反斜杠的正则表达式

时间:2014-02-18 21:35:51

标签: python regex

我知道有反斜杠的帖子,但他们的建议对我不起作用。 我试图捕捉SUBJECT之后的所有内容:以及公司(见下文)。

我正在使用此代码。注意双反斜杠\。但我的正则表达式的输出停止了 在CHI儿童,因为'CHI儿童'的反弹。我该怎么做才能处理这个不想被捕获的反斜杠?

indextext = re.findall(r'SUBJECT:\s+[A-Z\s\(\w+\%\)\;\&\:\-\,\/\\]+', udoc2)[0]
indextext = re.sub(r'\r\n','\n', indextext)

更新: 我无法预先指定'COMPANY:'的原因是因为每个文档都有不同的单词。有时公司不存在。我将被迫硬编码几十个例外。

udoc = [主题:创业者(93%);新闻稿(91%);营养(90%);学生\ r \ n&安培;学生生活(90%);预防&健康(90%);练习&健身(90%); \ r \ nVENTURE CAPITAL(90%);非营利组织(90%);计算机软件(85%); \ r \ nCHILDREN(78%);公共私营伙伴关系(78%);慈善机构(78%);赞助\ r \ N(78%);基金会(78%);慈善事业(78%);教育系统与机构\ r \ N(78%);联盟&合作伙伴关系(77%);娱乐与娱乐艺术(77%);产品\ n \ n创新(77%);工作场所计划(77%);运动与娱乐活动(74%); \ r \ nSPORTS FANS(74%);美国足球锦标赛(74%);许可协议\ r \ n(74%);美国足球(74%);体育(74%);农业部门(73%); \ r \ nOROROR FORCE(70%);执行官(70%);商业分析(67%);商业软件\ r \ n(62%)NY-GENYOUth-SAP; CHI儿童相关新闻; LIC许可和营销\ r \ nAgreements \ r \ n \ r \ nCOMCOM:]

当前输出: 主题:企业家(93%);新闻稿(91%);营养(90%);学生们 &安培;学生生活(90%);预防&健康(90%);练习&健身(90%); 风险投资(90%);非营利组织(90%);计算机软件(85%); 儿童(78%);公共私营伙伴关系(78%);慈善机构(78%);赞助 (78%);基金会(78%);慈善事业(78%);教育系统与机构 (78%);联盟&合作伙伴关系(77%);娱乐与娱乐艺术(77%);产品 创新(77%);工作场所计划(77%);运动与娱乐活动(74%); 体育迷(74%);美国足球锦标赛(74%);许可协议 (74%);美国足球(74%);体育(74%);农业部门(73%); 劳动力(70%);执行官(70%);商业分析(67%);商业软件 (62%)NY-GENYOUth-SAP; CHI儿童

6 个答案:

答案 0 :(得分:1)

你不是第一个在这里砰的一声

http://docs.python.org/2/howto/regex.html#the-backslash-plague

你需要4个反斜杠来逃避目标字符串中的反斜杠。

也就是说,我喜欢使用交互式工具来完善正则表达式,例如正则表达式教练。 http://www.weitz.de/regex-coach/

如果你不想做愚蠢的4反斜杠,请从你的外部工具复制并使用re.compile(re.escape(string))

http://docs.python.org/2/library/re.html#re.escape

答案 1 :(得分:1)

你的问题有点模糊,所以我不完全确定你在寻找什么

udoc = "SUBJECT: ENTREPRENEURSHIP (93%); PRESS RELEASES (91%); NUTRITION (90%); STUDENTS\r\n& STUDENT LIFE (90%); PREVENTION & WELLNESS (90%); EXERCISE & FITNESS (90%);\r\nVENTURE CAPITAL (90%); NONPROFIT ORGANIZATIONS (90%); COMPUTER SOFTWARE (85%);\r\nCHILDREN (78%); PUBLIC PRIVATE PARTNERSHIPS (78%); CHARITIES (78%); SPONSORSHIP\r\n(78%); FOUNDATIONS (78%); PHILANTHROPY (78%); EDUCATION SYSTEMS & INSTITUTIONS\r\n(78%); ALLIANCES & PARTNERSHIPS (77%); ENTERTAINMENT & ARTS (77%); PRODUCT\r\nINNOVATION (77%); WORKPLACE PROGRAMS (77%); SPORTS & RECREATION EVENTS (74%);\r\nSPORTS FANS (74%); AMERICAN FOOTBALL TOURNAMENTS (74%); LICENSING AGREEMENTS\r\n(74%); AMERICAN FOOTBALL (74%); SPORTS (74%); AGRICULTURE DEPARTMENTS (73%);\r\nLABOR FORCE (70%); EXECUTIVES (70%); BUSINESS ANALYTICS (67%); BUSINESS SOFTWARE\r\n(62%) NY-GENYOUth-SAP; CHI Children\'s Related News; LIC Licensing and Marketing\r\nAgreements\r\n\r\nCOMPANY:"

注意从列表到字符串的更改

在我看来,你正在寻找冒号之间的一切

s = udoc.split(':')[1]

然后你可能需要搞乱各个项目

mylist = [item for item in s.split(';')]

稍微清理它们

newlist = []
for item in mylist:
    newlist.append(' '.join(item.split()))

你可以通过一些简单的操作摆脱最后一个字(在这种情况下是公司)

newlist[-1] = ' '.join(newlist[-1].split()[:-1])

最后,如果您希望将结果作为字符串,只需使用某个分隔符加入新列表

答案 2 :(得分:1)

我的巨大注意事项:

我不喜欢你的做法,所以我把它扔出窗外。你要做的最后一件事是使用正则表达式匹配巨大的数字,而你等待的只是一些事情。这与正则表达式应该做的完全相反:所以你也不要这样做。

我的巨大假设:

我玩了很长时间的代码,试图找出你想要做的事情和原因。在我看来,你试图以某种方式索引这些值,比如{"ENTREPRENEURSHIP":93,"PRESS RELEASES":91,...},这就是我所建立的。也许这不是你的最终目标,在这种情况下,jeebus兄弟在这里给我们一些反馈....

My Itty Bitty Code:

text = """udoc = [SUBJECT: ENTREPRENEURSHIP (93%); PRESS RELEASES (91%); NUTRITION (90%); STUDENTS\r\n& STUDENT LIFE (90%); PREVENTION & WELLNESS (90%); EXERCISE & FITNESS (90%);\r\nVENTURE CAPITAL (90%); NONPROFIT ORGANIZATIONS (90%); COMPUTER SOFTWARE (85%);\r\nCHILDREN (78%); PUBLIC PRIVATE PARTNERSHIPS (78%); CHARITIES (78%); SPONSORSHIP\r\n(78%); FOUNDATIONS (78%); PHILANTHROPY (78%); EDUCATION SYSTEMS & INSTITUTIONS\r\n(78%); ALLIANCES & PARTNERSHIPS (77%); ENTERTAINMENT & ARTS (77%); PRODUCT\r\nINNOVATION (77%); WORKPLACE PROGRAMS (77%); SPORTS & RECREATION EVENTS (74%);\r\nSPORTS FANS (74%); AMERICAN FOOTBALL TOURNAMENTS (74%); LICENSING AGREEMENTS\r\n(74%); AMERICAN FOOTBALL (74%); SPORTS (74%); AGRICULTURE DEPARTMENTS (73%);\r\nLABOR FORCE (70%); EXECUTIVES (70%); BUSINESS ANALYTICS (67%); BUSINESS SOFTWARE\r\n(62%) NY-GENYOUth-SAP; CHI Children\'s Related News; LIC Licensing and Marketing\r\nAgreements\r\n\r\nCOMPANY:]"""
# sheesh that's a big string literal! Let's take a few lines to breathe.
# after all, we have to give the interpreter enough
# time
# to
# process all that
# data we just fed it
#
# ...right?

values = {' '.join(item[:-1]):item[-1].strip("(%)") for
  full_list in text.split(":")[1:-1] for
  element in full_list.split(";")[:-1] for
  item in [element.strip().split()]}

for key,value in values.items():
    print("{:35}: {}".format(key,value))

# AMERICAN FOOTBALL TOURNAMENTS      : 74
# LABOR FORCE                        : 70
# BUSINESS ANALYTICS                 : 67
# COMPUTER SOFTWARE                  : 85
# CHARITIES                          : 78
# AMERICAN FOOTBALL                  : 74
# BUSINESS SOFTWARE (62%)            : NY-GENYOUth-SAP
# FOUNDATIONS                        : 78
# CHILDREN                           : 78
# SPORTS                             : 74
# SPONSORSHIP                        : 78
# EDUCATION SYSTEMS & INSTITUTIONS   : 78
# PUBLIC PRIVATE PARTNERSHIPS        : 78
# SPORTS & RECREATION EVENTS         : 74
# NUTRITION                          : 90
# ALLIANCES & PARTNERSHIPS           : 77
# ENTERTAINMENT & ARTS               : 77
# PRESS RELEASES                     : 91
# WORKPLACE PROGRAMS                 : 77
# VENTURE CAPITAL                    : 90
# CHI Children's Related             : News
# STUDENTS & STUDENT LIFE            : 90
# AGRICULTURE DEPARTMENTS            : 73
# EXERCISE & FITNESS                 : 90
# ENTREPRENEURSHIP                   : 93
# NONPROFIT ORGANIZATIONS            : 90
# PRODUCT INNOVATION                 : 77
# SPORTS FANS                        : 74
# PHILANTHROPY                       : 78
# LICENSING AGREEMENTS               : 74
# PREVENTION & WELLNESS              : 90
# EXECUTIVES                         : 70

现在我知道你在说什么,“adsmith,”你开始说,“但看看”CHI儿童相关“和”商业软件(62%)“中的价值观,这显然是错误的!

我无法帮助您的输入格式不正确,没有人可以。 CHI Children's Related的值为News,这不是你的错,也不是我的错。他们忽略了在:BUSINESS SOFTWARE之间加(62%),我们也不承担责任。

结论

第二个想法,我们不要去re模块。 “这是一个愚蠢的地方。

答案 3 :(得分:0)

为什么不:

import re
re.search(r'SEARCH:(.+)COMPANY:', udoc2)

答案 4 :(得分:0)

您不必为此使用正则表达式。在这种情况下,似乎有一个更容易的解决方案。

为什么不获取“COMPANY:]”的索引,然后获取所有内容?

答案 5 :(得分:0)

这个怎么样?

(SUBJECT\:.*\:)

您可以在http://regex101.com/r/aB7nJ2

查看其工作原理