python如何换行输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何换行输入相关的知识,希望对你有一定的参考价值。

参考技术A Python换行输入的方法:可使用反斜杠连接多行代码,另一种方法是将代码或字符串用小括号括起来,实现换行;还可以用三个单引号。

在用户提交的内容中呈现换行符(Python Web 应用程序)

【中文标题】在用户提交的内容中呈现换行符(Python Web 应用程序)【英文标题】:Rendering newlines in user-submitted content (Python web app) 【发布时间】:2012-07-06 13:21:25 【问题描述】:

我有一个 web.py 应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面但 NEWLINES 消失了。发回 HTML 时如何保留换行符?数据中确实包含\r\n,但它不会在 HTML 中呈现为 NEWLINES。有什么想法吗?这是一个小例子:

(2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?', 
    datetime.datetime(2012, 7, 5, 21, 5, 14, 354516))

这是我从数据库返回的。我需要\r\n 来代表<br />,如果有两个<p> 会很棒。任何方向将不胜感激。

还有这个库吗?我听说过 markdown 和 mark up,但我找不到如何从 python 字符串发布 html 数据的示例?

【问题讨论】:

如果我能让 \r\n 代表一个

那就太好了。

这是一个三班轮:***.com/questions/10436458/… 【参考方案1】:

换行符不呈现为换行符是 html 中的预期行为。您想要的是插入<br> 或将您的输入解析为文本段落并用<p>..</p> 包装它们

我会混合使用这两种方法:将<br> 用于单个换行符,将<p>..</p> 用于双换行符。您可以在保存到数据库时或在将其取出时进行此解析。

编辑:我为您制作了以下图形。查看解析器的方法有很多种。就个人而言,我想将它们视为一种状态机。为了实现它,您应该以流的方式读取输入字符串,例如使用http://docs.python.org/library/stringio.html。

Edit2:将描述“下推自动机”更改为“状态机”。下推自动机是正确的,但不精确,并且与图表不匹配 - 我将两者混合在一起。

Edit3:这里有一些关于如何在代码中实现状态机解析器的 sudo 代码,使用 while 循环、switch case 和状态转换的 if 语句。

state = 'plainState'
streamer = get_stream_reader_from_input()
buffer = ''
while true 
  nextchar = streamer.readchar()
  if (nextchar == null)  //EOS
   print(buffer)
   exit
  
  switch (state) 
    case('plainState') 
      if (nextchar == '\n') 
        state = 'singleBreakState' 
      
      else if (nextchar == '\r') 
        state = 'CRState'
      
      else 
        buffer += nextchar
      
    
    case('singleBreakState') 
      if (nextchar == '\n') 
        state = 'doubleBreakState' 
      
      else if (nextchar == '\r') 
        state = 'CRState2'
      
      else 
        state = 'plainState'
        buffer += '<br>' + nextchar
      
    
    //...
  
  

【讨论】:

您刚刚重新发布了我的问题...如果您展示了如何将换行符解析为 ,那就太好了 @Helgi:感谢您的支持和编辑。有错字吗?有没有办法在这里查看差异? Paxwell:请参阅上面的更新。如果您在如何实现这样的事情上需要更多帮助,请告诉我。我同意 Helgi 不添加另一个库,但还有另一个原因:编写解析器是每个程序员都应该做几次的事情。学习此类基本任务可以让您以后自行解决更复杂的问题。 @MichelMüller:要查看差异,请单击帖子下方的时间戳链接(“4 小时前编辑”)。实际上,我将&lt;/br&gt;(注意/ 的位置)更改为&lt;br&gt;。可能是&lt;br/&gt;,但我们这里似乎不是在谈论 XHTML。【参考方案2】:

执行此操作的两种主要方法。最简单的方法是将输出包装在 &lt;pre&gt;&lt;/pre&gt; 中,这将按照输入的格式对其进行格式化。

或者,您可以用&lt;br /&gt;(而不是&lt;p&gt;)替换newlies,因为字符代表换行符而不是段落。

对于第二种选择,这是一种方法:

>>> s
'hello\nthere\r\nthis\n\ris a test'
>>> r = '<br />'
>>> s.replace('\r\n',r).replace('\n\r',r).replace('\r',r).replace('\n',r)
'hello<br />there<br />this<br />is a test'
>>> 

或者第三个选项 - 使用众多文本输入库/格式之一并通过它们呈现内容(正如其他人所提到的 - 如降价)。

但是,如果您只想做一个简单的替换,那就太过分了。

【讨论】:

&lt;pre&gt; 禁用文本换行(我认为它是文本,而不是代码)。所以这比没用还糟糕。替换具有您应该真正提到的安全隐患。 没有安全影响,因为替换和搜索文本都是固定的;问题很简单——他想渲染输入的文本,回车显示为换行符。 OP 似乎在使用 Jinja,默认情况下会转义 HTML。一旦我们开始在输出中插入标签,Jinja 转义(safe 过滤器)应该被关闭,因为它也会转义插入的&lt;br /&gt;s。因此,我们应该手动对用户输入的文本进行转义,这是以前不需要的操作。 对于像我这样正在寻找 jinja2 解决方案的人,下面的 *** 链接可以回答这个问题。我很难找到这个答案,所以把链接放在这里***.com/questions/10436458/…【参考方案3】:

在提出解决方案之前,您需要对正在发生的事情有一些基本的了解。如果你不理解这个问题,那么“扔进另一个库”的方法要么根本不起作用(更好),要么很快就会适得其反(更糟)。

@MichelMüller 正确地指出 HTML 源代码中的 \ns 不会在浏览器中呈现。有关此行为的更详细说明,请参阅this tutorial(警告,HTML 2.0 描述)。现在,要在 HTML 中添加换行符,请使用 &lt;br&gt;;换一个新段落,&lt;p&gt;

您可以做很多事情来实现这一目标,但您要解决的问题是什么?这个用户提交的内容是什么?谁提交?需要考虑的两个方面是:

    格式化。是公共网站上的评论,还是网站工作人员准备的帖子,还是 Stack Overflow 等网站上的 UGC? 安全。它是由陌生人发布的,还是由完全信任的用户发布的,还是介于两者之间?

可能的解决方案:

最直接的方法是在输出到模板格式化程序之前运行text.replace('\r\n', '&lt;br&gt;')。如果您不在模板中放置 text | safe ,则 in 将不起作用,因为 Jinja 不应逃避您生成的 &lt;br&gt;s。但是,文本本身不应该完全信任,因此您必须转义 &lt;&amp;(至少)替换换行符之前。

查看MarkupSafe,了解处理 HTML 转义的不那么特别的方法。顺便说一句,它是由 Jinja 使用的。

对于非结构化内容的格式(即用户提交的 cmets a la YouTube),请查看 PottyMouth 库。

如果您的内容准备充分(博客平台或类似 Stack Overflow 的网站上的帖子),请尝试 @BernhardKircher 建议的 Markdown。它有一些学习曲线,所以如果用户愿意花一些时间写帖子,效果最好。记得正确配置解析器,因为核心 Markdown 不会转义 HTML

对于员工准备的内容,您可以使用 Markdown 或更复杂的东西。这真的取决于员工的背景。在这里,未转义的 HTML 可能是一种祝福,而不是一种诅咒。

【讨论】:

【参考方案4】:

您可以使用诸如markdown之类的格式化语言(如您所提到的),而不是使用不是html的插入文本,因此不会显示为html(\r\n不是“p”标签等) .

否则您将需要手动替换/解析输入的文本(我认为这不是一个好主意,因为已经为此发明了诸如 markdown 之类的语言)。

有一些很好的 python 库可以将 ma​​rkdown(您存储在数据库中的数据)转换为 html,例如 python-markdown2。

它真的很容易使用,请参阅 python-markdown 链接中的示例:

>>> import markdown2
>>> markdown2.markdown("*boo!*")  # or use `html = markdown_path(PATH)`
u'<p><em>boo!</em></p>\n'

>>> markdowner = Markdown()
>>> markdowner.convert("*boo!*")
u'<p><em>boo!</em></p>\n'
>>> markdowner.convert("**boom!**")
u'<p><strong>boom!</strong></p>\n'

这会强制您使用 markdown 语法(或您使用的任何格式)输入内容。为了使这更容易,您可以使用 wysiwyg-editor 为您创建降价(就像 *** 上的编辑器)。 我认为 *** 使用了wmd,但还有很多其他 Markdown 所见即所得的编辑器。

wmd 示例:

<html>
    <head>
        <title>WMD Example using jquery</title>
        <link rel="stylesheet" type="text/css" href="wmd.css"/>

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript" src="jquery.wmd.min.js"></script>
    </head>
    <body>
        <h1>WMD Example using jquery</h1>
        <div>
            <textarea id="notes"/>
        </div>

        <script type="text/javascript">
            $().ready(function() 
               $("#notes").wmd(); 
            );
        </script>
    </body>
</html>

【讨论】:

wms 还是 wmd?如果您能举例说明如何将 hi\r\n 转换为

hi

您的答案内容丰富但缺乏直接答案
@Paxwell 抱歉,我拼错了 JS 库,它的 WMD(我在回答中更正了它)。你是对的,我的回答并没有告诉你如何用 html 标签替换 \r\n,但它建议以不同的方式处理输入,所以不要插入包含 \r\n 等的“纯”文本。我会使用Markdown 编辑器,允许用户输入文本并使用更多选项对其进行格式化。例如,当使用 python 库将用户输入(在你的数据库中是 markdown 和 sorted)转换回 html 时,应该正确显示换行符。

以上是关于python如何换行输入的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用enter(Python)引入由换行符完成的输入 n?

python如何输入二维数组

python中怎么换行?

python中如何将回车作为输入内容

Python输出换行的两种方法

如何将字符串以换行符为界写入列表